剑指–数组中数字出现的次数 II
1,题目:
2,思路:
方法一:异或运算
(主要是异或的思想:这个符号为异或的意思,只要两个数相等值就为0,只要是不同值就为1)
- 先对数组进行排序
- nums[0] != nums[1]就证明nums[0]是出现了一次
- nums[len - 1] != nums[len - 2]就证明nums[len - 1]是出现了一次 ((nums[i] ^nums[i + 1]) != 0) && ((nums[i] ^ nums[i - 1]) !=0)就表示这个数与前面后面的数都不一样,并且是排好序的,所以其异或的值才不为0,所以这个数就出现了一次。(^这个符号为异或的意思,只要两个数相等值就为0,只要是不同值就为1.)
方法二:在数组中比较后面的值和自己是否相等:
主要是:if(nums[i] == nums[i+1] && nums[i+1] == nums[i+2] )
3,代码:
方法一:异或运算
class Solution {
public int singleNumber(int[] nums) {
int len = nums.length;
Arrays.sort(nums);
if (len == 1 || nums[0] != nums[1])
return nums[0];//因为已经排好序了,nums[0] != nums[1]就证明nums[0]是出现了一次
if (nums[len - 1] != nums[len - 2])
return nums[len - 1];//因为已经排好序了,nums[len - 1] != nums[len - 2]就证明nums[len - 1]是出现了一次
for (int i = 1; i < len - 1; i++) {//下面处理i从1到len-1的元素
if (((nums[i] ^ nums[i + 1]) != 0) && ((nums[i] ^ nums[i - 1]) != 0))
//^这个符号为异或的意思,只要两个数相等值就为0,只要是不同值就为1.
//((nums[i] ^ nums[i + 1]) != 0) && ((nums[i] ^ nums[i - 1]) != 0)就表示这个数与前面后面的数都不一样,并且是排好序的,所以其异或的值才不为0,所以这个数就出现了一次。
return nums[i];
}
return 0;
}
}
方法二:在数组中比较后面的值和自己是否相等:
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int len = nums.length;
if(len == 1) return nums[0];
for(int i = 0; i < len-3; ) {
if(nums[i] == nums[i+1] && nums[i+1] == nums[i+2] )
i += 3;
else return nums[i];
}
return nums[len-1];
}
}