提高程序員技能:3個適用於演算法和數據結構練習的挑戰

一、字謎遊戲

字謎遊戲是一個非常好的練習數據結構和演算法的挑戰,在這個遊戲中,玩家需要猜出一組由字母組成的單詞,每次猜測後會告訴玩家猜對的字母和猜錯的字母的數量。

為了實現這個遊戲,我們可以使用一個哈希表來存儲單詞和其中每個字母的出現次數。當玩家猜測單詞時,我們可以使用另一個哈希表來存儲猜測的字母和其出現的次數。然後我們將這兩個表進行比較,得到猜對的字母數量和猜錯的字母數量,重複此過程直到猜對全部字母。

class WordGame {
  public:
    bool guess(string secret, string guess) {
      unordered_map cnt;
      for (char c : secret) cnt[c]++;
      int a = 0, b = 0;
      for (int i = 0; i < guess.size(); i++) {
        if (guess[i] == secret[i]) {
          a++;
          cnt[guess[i]]--;
        }
        else if (cnt[guess[i]]) {
          b++;
          cnt[guess[i]]--;
        }
      }
      return a == secret.size() and b == secret.size();
    }
};

二、刪除排序鏈表中的重複元素

在鏈表相關的演算法和數據結構中,刪除排序鏈表中的重複元素也是一個非常有趣的問題。我們需要將所有重複的元素僅保留一個,並返回去重後的鏈表。

為了解決這個問題,我們可以創建一個指針指向當前鏈表的首位,然後依次遍歷鏈表中的每個元素。如果當前元素的值和它下一個元素的值相同,那麼就將當前元素的下一個指針指向下下一個元素,直到找到一個和當前元素不同的元素。

class Solution {
  public:
    ListNode* deleteDuplicates(ListNode* head) {
      if (head == nullptr) return nullptr;
      ListNode* curr = head;
      while (curr->next != nullptr) {
        if (curr->val == curr->next->val) {
          ListNode* tmp = curr->next;
          curr->next = curr->next->next;
          delete tmp;
        } else {
          curr = curr->next;
        }
      }
      return head;
    }
};

三、最短路徑演算法

最短路徑演算法是計算從一個圖中一個節點到另一個節點的最短路徑的演算法。其中,Dijkstra演算法是一種非常著名的最短路徑演算法,它可以在一個加權有向圖中,從一個源點出發,計算出到其他所有點的最短路徑。

為了實現Dijkstra演算法,我們需要使用一個優先隊列來存儲每個節點到源點的距離。然後我們依次擴展隊列中距離源點最近的節點,並更新其周圍節點的距離和路徑。

#define N 100005
typedef pair PII;

int h[N], e[M], w[M], ne[M], idx;
int dist[N], cnt[N];
bool st[N];
int n;

void add(int a, int b, int c) {
  e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

void dijkstra() {
  memset(dist, 0x3f, sizeof dist);
  priority_queue<PII, vector, greater> q;
  dist[1] = 0;
  q.push({0, 1});
  while (q.size()) {
    auto t = q.top();
    q.pop();
    int ver = t.second, distance = t.first;
    if (st[ver]) continue;
    st[ver] = true;
    for (int i = h[ver]; i != -1; i = ne[i]) {
      int j = e[i];
      if (dist[j] > distance + w[i]) {
        dist[j] = distance + w[i];
        cnt[j] = cnt[ver] + 1;
        if (cnt[j] >= n) puts("exist negative cycle");
        q.push({dist[j], j});
      }
    }
  }
}

int main() {
  memset(h, -1, sizeof h);
  cin >> n >> m;
  while (m--) {
    int a, b, c;
    cin >> a >> b >> c;
    add(a, b, c);
  }
  dijkstra();
  return 0;
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/293977.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-26 13:15
下一篇 2024-12-26 13:15

相關推薦

  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • 兼職程序員能掙錢嗎?

    可以。不過,兼職程序員賺錢的關鍵就在於如何找到並利用合適的機會。 一、掌握技能 作為程序員,掌握必要的技能是兼職掙錢的前提。除了紮實的編程技能,了解相關工具和平台也非常重要。常見的…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 數據結構與演算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與演算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序演算法、字元串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 數據結構學生成績管理系統

    在現代教育中,學生成績的管理已經成為了一個不可或缺的部分。藉助數據結構,一個高效、可靠的學生成績管理系統可以被輕鬆實現。 一、數據結構的選擇 在構建學生成績管理系統時,選擇合適的數…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群演算法Python的介紹和實現

    本文將介紹粒子群演算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群演算法的原理 粒子群演算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29

發表回復

登錄後才能評論