找单独的数题目分析及个人思考| 豆包MarsCode AI 刷题

62 阅读3分钟

public class Main {
    public static int solution(int[] cards) {
        // 初始化一个变量来存储结果
        int result = 0;
        
        // 遍历数组中的每个元素
        for (int i = 0; i < cards.length; i++) {
            // 对每个元素进行异或运算
            result ^= cards[i];
        }
        
        // 返回最终结果
        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 提示用户输入数组
        System.out.println("请输入数组元素,以空格分隔:");
        
        // 读取用户输入的数组
        String input = scanner.nextLine();
        String[] inputArray = input.split(" ");
        
        // 将输入的字符串数组转换为整数数组
        int[] cards = new int[inputArray.length];
        for (int i = 0; i < inputArray.length; i++) {
            cards[i] = Integer.parseInt(inputArray[i]);
        }
        
        // 调用 solution 函数并输出结果
        int result = solution(cards);
        System.out.println("唯一出现一次的数字是:" + result);
        
        scanner.close();
    }
# }

题目分析

给定一个数组,其中大部分数字都是成对出现的,只有一个数字是独自出现的,目标是找出这个唯一出现的数字。

常用解题方法

使用哈希表

利用哈希表来记录数字的出现次数。遍历数组,对于每个数字,将其计数;最后返回计数为 1 的数字。

使用排序

先对数组进行排序,数组中成对出现的数字会被排在一起,单独的数字会与其他数字不同。遍历排序后的数组,检查相邻的元素,如果它们不同,说明它们就是单独的数字。

使用数学公式

利用数组中数字和理想情况下成对出现时数字之和的差异。

使用位运算和基于集合

和异或运算类似,但可以结合集合或其他位运算技术来优化。

使用异或运算

过遍历数组并对所有数字进行异或运算,成对出现的数字会被抵消,最后剩下的就是那个单独出现的数字。

异或运算的性质

1.任何数与 0 异或的结果是它本身。 2.任何数与自身异或的结果是 0。 3.异或运算满足交换律和结合律。

异或运算详解

通过异或运算,我们可以逐个遍历数组的数字,并对它们进行异或操作。由于 同一个数字异或两次结果为 0(即 x ^ x = 0),因此成对出现的数字会相互抵消掉,最终唯一剩下的就是那个只出现一次的数字。

时间复杂度和空间复杂度分析

时间复杂度分析

我们只需要遍历一遍数组,因此时间复杂度是 O(n),其中 n 是数组的大小。

空间复杂度分析

我们只使用了一个额外的变量 a来存储最终的结果,因此空间复杂度是 O(1),即常数空间。

总结

通过使用异或运算,我们可以非常高效地解决这个问题。异或运算的性质帮助我们在 O(n) 时间复杂度和 O(1) 空间复杂度内找出那个只出现一次的数字。这种解法不仅时间复杂度优越,而且空间复杂度非常低,适合处理大规模的数据集。