1.题目
https://leetcode.cn/problems/single-number/
考察点
- 位运算,即对二进制数进行的运算,比如与、或、非、异或等。
- 异或运算,即按位比较两个数,如果不同则为1,相同则为0。异或运算的符号是^。
- 异或运算的性质和应用,比如:任何数和0异或,结果还是原来的数;任何数和自己异或,结果是0;异或运算满足交换律和结合律;异或运算可以用来找出数组中只出现一次的数字。
- 这道题也可以用哈希表或排序的方法来解决,但是会增加空间复杂度或时间复杂度。
2.解法
这道题的解题思路是使用异或运算,
因为异或运算满足交换律和结合律,且任何数和0异或等于自身,任何数和自身异或等于0。
这道题的目标是找到一个数组中只出现一次的数字,其他数字都出现两次。一个简单的方法是使用异或运算符,因为异或运算符有以下性质:
- 任何数和0异或,结果仍然是原来的数,即a^0=a。
- 任何数和自身异或,结果是0,即a^a=0。
- 异或运算满足交换律和结合律,即abc=a(bc)=(ab)c。
所以,我们可以遍历数组中的所有数字,用一个变量result来保存异或的结果。初始时,result为0。每次遍历一个数字num,就将result和num
class Solution { public int singleNumber(int[] nums) { // 初始化result为0 int result = 0; // 遍历数组中的所有数字 for (int num : nums) { // 将result和num异或,更新result的值 result ^= num; } // 返回result return result; } }