提高程序员技能: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/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

发表回复

登录后才能评论