青训营X豆包MarsCode 技术训练营第一课 找单独的数 | 豆包MarsCode AI 刷题

68 阅读2分钟

一、题目背景

问题描述:在一个班级中,每位同学都拿了一张带有整数数字的卡片,其中只有一个数字是单独的,其余数字都出现了两次。

目的:在一个整数数组中,需要找到唯一一个出现一次的数字。而数组中的其他数字都恰好出现两次。

二、解题思路

1、利用异或运算的性质:相同数字异或结果为0,任何数与0进行异或运算,结果仍然是原来的数。

2.将所有卡片上的数字进行异或运算,成对的数字异或后结果为0,剩下的就是那个独特的数字。

三、代码实现

我选择了Java语言进行代码实现,使用了异或操作来解决这个问题,这个方法的时间复杂度是O(n),空间复杂度是O(1),这是一种高效且节省空间的方法。

在这段代码中:

1.solution 方法接收一个整数数组 inp 作为参数。

2.在方法内部,首先声明了一个整数变量res ,并将其初始化为0。这个变量将用于存储最终的结果,即唯一一个出现一次的数字。

3.接下来,通过一个增强型for循环遍历输入数组 inp 中的每个数字。

4.在循环内部,使用异或操作符^将当前数字与 res 进行异或运算。 由于异或运算具有以下性质:

(1)任何数与0进行异或运算,结果仍然是原来的数。

(2)任何数与其自身进行异或运算,结果是0。

(3)异或运算满足交换律和结合律。

因此,当所有数字进行异或运算后,成对的数字将会相互抵消,最终剩下的结果就是那个只出现一次的数字。

5.循环结束后,res中存储的值就是那个唯一一个出现一次的数字,将其返回。

6.main 方法中包含了两个测试用例,用于验证so1ution 方法是否正确。每个测试用例都调用了 solution 方法,并使用 == 操作符检查返回值是否与预期的唯一数字相等。然后使用 system.out.println 输出结果。

image.png

由于异或运算的性质,即使输入数组中的数字顺序不同,该方法也能正确地工作。

五、总结

《找单独的数》这道题中运用了异或运算,它能够以极低的时间复杂度和空间复杂度找到数组中唯一出现的数字。异或运算的特性使得算法实现既高效又简洁,避免了额外的内存开销,同时保证了算法的正确性和可靠性。

其中AI刷题中,可以利用AI陪练进行思路、代码提示,也可以进行代码检查。

image.png