本文思路:使用i冒泡遍历整个数组
先将数组由小到大排序,使用i冒泡遍历整个数组,数组最后一个元素单独讨论;当数组中只有一个数时,单独讨论。
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);//将数组由小到大排序
for(int i=0;i<nums.length-1;){//遍历数组元素从第一个到倒数第二个
if(nums[i]!=nums[i+1]){//如果相连两个数不相等,则输出前一个数
return nums[i];
}else {//如果相连两个数相等,让指针指向第三个数,即i+2
i+=2;
}
if (i == nums.length-1){//处理最后一个数,如果i指向最后一个数,
return nums[i];//说明这个数在数组中一定只出现一次,返回该数
}
}
if(nums.length==1){//当数组的长度为1时,直接输出数组中的元素
return nums[0];
}
return 0;
}
}
参考答案:通过位运算解决
“^” 是异或运算符,异或的规则是转换成二进制比较,相同为0,不同为1.
异或运算符可认为是无进位的二进制相加,如:6^7
如6的二进制为:0000 0110
如7的二进制为:0000 0111
则6^7=1
a^a=0;自己和自己异或等于0
a^0=a;任何数字和0异或还等于他自己
a^b^c=a^c^b;异或运算具有交换律
利用a^a=0性质,则所有出现偶数次的数异或结果都为0,遍历数组将所有的数异或,得到的结果即为出现奇数次的数。
public int singleNumber(int[] nums) {
int result = 0;
for (int i = 0; i < nums.length; i++) {
result ^= nums[i];
}
return result;
}