题目解析:寻找独特的数字

86 阅读3分钟

在这道题目中,我们需要找到一个数组中唯一出现一次的数字,而其他数字都恰好出现了两次。这个问题的一个巧妙解法是利用异或(XOR)运算的性质。异或运算有几个关键特性:

  1. 自反性a ^ a = 0,任何数与自身异或结果为0。
  2. 交换律和结合律:异或运算满足交换律和结合律,即a ^ b = b ^ a,以及(a ^ b) ^ c = a ^ (b ^ c)
  3. 零的特性a ^ 0 = a,任何数与0异或结果为其本身。

基于这些性质,我们可以将所有数字进行一次异或操作。由于数组中除了一个数字外,其他数字都出现两次,成对出现的数字会在异或过程中相互抵消(变为0),最终剩下的就是那个只出现一次的数字。

代码详解

public class Main {
    public static int solution(int[] cards) {
        int uniqueNumber = 0;
        for (int card : cards) {
            uniqueNumber ^= card; // 使用异或操作抵消成对的数字
        }
        return uniqueNumber;
    }

    public static void main(String[] args) {
        // 测试样例
        System.out.println(solution(new int[]{1, 1, 2, 2, 3, 3, 4, 5, 5})); // 输出4
        System.out.println(solution(new int[]{0, 1, 0, 1, 2}));            // 输出2
        System.out.println(solution(new int[]{7, 3, 3, 7, 10}));           // 输出10
    }
}

在这段代码中,uniqueNumber初始化为0,然后遍历数组中的每个元素,对其进行异或操作。最终,uniqueNumber将包含那个只出现一次的数字。

知识总结

通过这道题,我深刻理解了异或运算在算法中的应用,特别是在处理这类“寻找唯一元素”的问题时,异或运算提供了一种高效且优雅的解决方案。这种解法的时间复杂度为O(n),因为我们只需遍历数组一次,而且空间复杂度为O(1),因为我们只使用了一个额外的变量来存储结果。

对于入门同学,我建议在学习数据结构和算法时,不仅要掌握基础的知识点,还要学会灵活运用各种位运算,特别是异或运算。它往往能在某些特定问题上提供意想不到的简洁解法。

学习计划

在使用豆包MarsCode AI刷题时,我总结了一套高效的学习方法:

  1. 制定计划:首先,根据自己的学习能力和时间,制定一个合理的刷题计划。比如,每天刷几道题,每周复习一次错题。

  2. 分类练习:将题目按照难度和知识点进行分类,先从简单的题目开始,逐步过渡到复杂的题目。这样可以帮助自己系统地掌握每个知识点。

  3. 错题本:对于做错的题目,一定要认真分析错误原因,并将错题记录下来。定期回顾错题本,可以有效避免重复犯错。

  4. 总结归纳:每做完一类题目,都要进行总结归纳,梳理出解题思路和技巧。这样可以帮助自己形成系统的知识体系。

工具运用

为了达到更好的学习效果,我将豆包MarsCode AI刷题功能与其他学习资源相结合:

  1. 结合视频教程:在遇到难以理解的知识点时,我会观看相关的视频教程,帮助自己更好地理解和掌握。

  2. 参与讨论区:在豆包MarsCode AI的讨论区中,我可以与其他同学交流解题心得,互相学习,共同进步。

  3. 利用辅助工具:我还会使用一些辅助工具,比如在线编程环境、代码调试工具等,来帮助自己更好地调试和测试代码。

通过这种方法,我不仅提高了自己的编程能力,还学会了如何高效地利用学习资源,为未来的学习和工作打下了坚实的基础。