1."找单独的数"java版| 豆包MarsCode AI刷题

66 阅读4分钟

题目解析

题目给定一个整数数组cards,数组中有一个数字出现了一次,其余所有的数字都恰好出现了两次,我们的任务是要找出那个出现一次的数字

解题思路

我们可以利用几种常见的编程技巧来解决这个问题,以下是几种解法的思路:

1.利用哈希表

哈希表可以帮助我们快速统计每个数字出现的次数,在遍历数组时,我们记录每个数字出现的次数,最终查找出现次数为1的数字。

步骤
  • 遍历数组,对于每个数字,记录它出现的次数。
  • 然后遍历哈希表,找到出现次数为1的数字。

这种方法的时间复杂度为 O(n),空间复杂度为 O(n),其中 n 是数组的长度。

2.利用位运算

另一种更为高效的解法是利用异或运算的特性。异或运算有一个重要的性质:

  • a ^ a = 0(相同的数字异或结果为 0)
  • a ^ 0 = a(任何数字与 0 异或结果为其本身)

由于数组中只有一个数字出现一次,其他数字都成对出现,所有成对的数字异或后结果为 0。最终的结果将是那个唯一出现的数字。

这种方法的时间复杂度为 O(n),空间复杂度为 O(1),非常高效。

代码实现

为了清晰展示解题过程,下面是基于哈希表的实现代码:

import java.util.HashMap; import java.util.Map;

public class Main { public static int solution(int[] cards) { Map<Integer, Integer> n2t = new HashMap<>();

    // 遍历数组,统计每个数字的出现次数
    for (int card : cards) {
        n2t.put(card, n2t.getOrDefault(card, 0) + 1);
    }

    // 遍历哈希表,找出出现次数为1的数字
    for (Map.Entry<Integer, Integer> entry : n2t.entrySet()) {
        if (entry.getValue() == 1) {
            return entry.getKey();
        }
    }
    return -1;
}

public static void main(String[] args) {
    System.out.println(solution(new int[]{1, 1, 2, 2, 3, 3, 4, 5, 5}) == 4);  // 4 should be the result
    System.out.println(solution(new int[]{0, 1, 0, 1, 2}) == 2);  // 2 should be the result
}

}

知识总结

在这道题目中,我们涉及到了一些关键的编程知识点,尤其是数据结构和位运算:

  1. 哈希表:哈希表是一种常见的用于存储键值对的数据结构,具有高效的查找和更新操作。在这道题中,哈希表用于统计每个数字出现的次数。
  2. 异或运算:异或是一种非常有用的位运算,能够高效地解决一些特定类型的编程问题。在这道题中,利用异或的性质,我们能够快速找出唯一的数字,而无需额外的空间。

刷题计划

对于类似的题目,建议按以下步骤进行刷题:

  1. 基础题目:从数组和哈希表基础题目入手,逐步熟悉常见的数据结构和算法。比如查找重复数字、统计频率等问题。
  2. 进阶题目:尝试挑战一些涉及位运算的题目。理解异或运算的性质,并在实际题目中进行应用,如寻找唯一数字、不同的数字等。
  3. 多角度优化:在解决问题时,尝试多种不同的算法思路,从哈希表解法到位运算解法,再到其他更高效的解法。每一种解法都要考虑其时间和空间复杂度,选择最优方案。

工具运用

豆包可以在编程和算法学习过程中提供巨大的帮助,以下是一些具体的应用场景:

  1. 解题思路建议:当你遇到编程难题时,AI 可以帮助提供不同的解法思路,比如哈希表、动态规划、分治法等,从而拓宽你的思维。
  2. 代码生成与优化:AI 可以帮助快速生成代码模板,并根据需求进行优化。比如根据题目描述,AI 可以自动编写出基本的解题代码,并给出性能优化的建议。
  3. 错题分析:通过与 AI 互动,你可以更深入地理解错误的原因,获得更具体的调试建议,帮助你更好地改进自己的代码。
  4. 编程学习辅助:AI 能够帮助你分析算法的时间和空间复杂度,提供更好的学习资源和练习题,甚至模拟面试过程,提升你的编程能力。