题目:
解题思路及代码
解题思路
1、将数组进行排序;
2、双指针i= 0;j= 1;向右滑动
循环逻辑:
while循环,当j> nums.length时退出循环;
当i,j指向的数值相等时,j++,指针右移;
但不相等时,两种情况:
找到(j-i == 1),此时又分为两种情况(case1和case2);
未找到(j-i >1) 此时令i =j,j=j+1;窗口整体右移,重复判断;
case1:只出现1次的数字为nums[i],此时,i=0;j=1,且nums[i]!= nums[j],直接返回i对应的值;
case2:只出现1次的数字在排序数组中间,判断条件j-i == 1,依旧返回i对应的值;
case3: 只出现1次的数字在排序数组末尾,循环已结束,此时i指向数组末尾,依旧返回i对应的值;
代码
解题思路
1、将数组进行排序;
2、双指针i= 0;j= 1;向右滑动
循环逻辑:
while循环,当j> nums.length时退出循环;
当i,j指向的数值相等时,j++,指针右移;
但不相等时,两种情况:
找到(j-i == 1),此时又分为两种情况(case1和case2);
未找到(j-i >1) 此时令i =j,j=j+1;窗口整体右移,重复判断;
case1:只出现1次的数字为nums[i],此时,i=0;j=1,且nums[i]!= nums[j],直接返回i对应的值;
case2:只出现1次的数字在排序数组中间,判断条件j-i == 1,依旧返回i对应的值;
case3: 只出现1次的数字在排序数组末尾,循环已结束,此时i指向数组末尾,依旧返回i对应的值;
代码
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int i = 0,j =1;
while(j<= nums.length-1 ){
if(nums[i]== nums[j]){
j++;//所求数字不在此范围内,指针j向右移动
}else{
if(i == 0&& j== 1) return nums[0];//nums[0]为所求数字
else if(j-i == 1) return nums[i]; //所求数字在数组中间
else{
i= j;
j++;
}
}
}
return nums[i];//所求数字在数组最后,此时指针i指向排序数组的末尾
}
}