自己的垃圾代码
运用两层循环来逐一比较,当第二层循环执行完一轮之后,若a的值未发生改变,则说明这次比较的数字只出现了一次。
class Solution {
public int singleNonDuplicate(int[] nums) {
int num=0;
for (int i=0;i<nums.length;i++){
boolean a=true;
for (int j=0;j<nums.length;j++){
if (i==j){
continue;
}
if (nums[i]==nums[j]){
a=false;
break;
}
}
if (a){
num=nums[i];
break;
}
}
return num;
}
}
网上的大佬运用了二分法查找
class Solution {
public int singleNonDuplicate(int[] nums) {
int left=0;
int right=nums.length-1;
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid] == nums[mid-1]){//中点跟左边的相等,则判断除开中点,左边还剩几位数;
if((mid-left)%2 == 0){//若为偶数,则说明左边的存在答案值,改变right的值
right = mid-2;
} else {//若为奇数,则说明右边的存在答案值,改变left的值
left = mid+1;
}
} else if(nums[mid] == nums[mid+1]){//中点跟右边的相等,则判断除开中点,右边还剩几位数;
if((right-mid)%2 == 0){//若为偶数,则说明右边的存在答案值,改变left的值
left = mid+2;
} else {//若为奇数,则说明左边的存在答案值,改变right的值
right = mid-1;
}
} else{//中点跟左右都不相等,直接返回
return nums[mid];
}
}
return nums[right];
}
}
写的很详细,一眼就能看懂,自己学过的算法的拿出来用,不能老是用笨办法。
另外,今天又一次告诉我自己,在写程序一定要学会使用break
今天使用了break直接使得代码快了一倍。