题目:

解题思路及代码
解题思路
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指向排序数组的末尾
}
}

这篇博客介绍了如何利用排序和双指针技巧解决数组中找出唯一出现一次的数字的问题。首先对数组进行排序,然后设置两个指针i和j,初始分别指向数组的第一个和第二个元素。在循环中,当i和j指向的数字相等时,j右移;否则,根据j-i的值判断是否找到只出现一次的数字并返回。在不同情况下,博客提供了详细的逻辑分析和代码实现。
1181

被折叠的 条评论
为什么被折叠?



