代码解析-找单独数 | 豆包MarsCode AI刷题

3 阅读3分钟

代码分析

这段代码是解决“寻找独特数字卡片”问题的优秀实现。问题的核心在于:在一个包含n个整数的数组中,除了一个数字外,其他所有数字都恰好出现了两次,要求找到那个只出现一次的数字。

使用的算法

这段代码采用的核心算法是异或运算(XOR) 。异或运算的一个重要性质是:对于任何数x,都有x 0 = x。这意味着如果我们将所有数字进行异或运算,成对出现的数字会因为相同的值而抵消为0,最终留下的就是只出现一次的数字。

具体步骤如下:

  1. 初始化一个变量result为0,用于存储异或结果。
  2. 遍历数组中的每个元素,将其与result进行异或运算,并将结果存回result
  3. 遍历结束后,result中存储的就是那个只出现一次的数字。
    public static int solution(int[] cards) {  
        // 初始化一个变量来存储异或结果  
        int result = 0;  
          
        // 遍历数组,对每个元素进行异或运算  
        for (int card : cards) {  
            result ^= card;  
        }  
          
        // 返回最终结果  
        return result;  
    }  
  
    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  
          
        // 你可以添加更多的测试用例来验证算法的正确性  
    }  
}

使用的数据结构

代码中使用的主要数据结构是数组int[] cards),用于存储每位同学卡片上的数字。此外,还使用了整型变量result来存储异或运算的中间和最终结果。

空间复杂度

该算法的空间复杂度非常低,为O(1) 。除了输入数组本身所占用的空间外,算法只使用了常数个额外变量(result),不随输入规模n的变化而变化。这体现了算法在空间使用上的高效性。

时间复杂度

算法的时间复杂度为O(n) ,其中n是数组的长度,也即班级的人数。这是因为算法只需要遍历数组一次,对每个元素执行一次异或运算。这种线性时间复杂度对于处理大规模数据是非常有利的。

代码的优点

  1. 高效性:算法的时间复杂度和空间复杂度都非常低,分别达到了O(n)和O(1),这对于处理大规模数据非常有利。
  2. 简洁性:代码实现简洁明了,通过异或运算的巧妙应用,避免了复杂的逻辑判断和额外的数据结构。
  3. 正确性:算法基于异或运算的性质,能够准确找到只出现一次的数字,且不受其他数字的影响。
  4. 可扩展性:虽然问题针对的是整数数组,但该算法的思想可以扩展到其他类型的数据,只要这些数据支持异或运算。

总结

这段代码是解决“寻找独特数字卡片”问题的优秀示例,它充分利用了异或运算的性质,以线性时间复杂度和常数空间复杂度高效地解决了问题。代码简洁明了,易于理解和扩展,是算法优化和空间效率方面的典范。通过这段代码,我们可以看到,在解决特定问题时,选择合适的算法和数据结构对于提高代码的性能和可读性至关重要。