1、题目
540. 有序数组中的单一元素 - 力扣(LeetCode)
2、实现
(1)方法一:以步长为2遍历数组
代码:
/**
* @param {number[]} nums
* @return {number}
*/
var singleNonDuplicate = function(nums) {
// 方法一:以步长为2对数组进行遍历
const n = nums.length;
for(let i=0; i<=n-2; i+=2) {
if(nums[i] !== nums[i+1]) {
// 如果是成对出现的元素,则前后元素是相等的
return nums[i];
}
}
// 遍历到最后都没发现,说明答案是数组的最后一个元素
return nums[n-1];
};
(2)方法二:异或
思路:
异或:相同元素异或结果为0,即成对出现的元素异或结果为0;又因为0与任何元素异或都是任何元素本身,所以所有元素都异或一遍,就是我们想要的结果啦。
代码:
/**
* @param {number[]} nums
* @return {number}
*/
var singleNonDuplicate = function(nums) {
// 方法二:异或
const n = nums.length;
let res = nums[0];
for(let i=1; i<n; i++) {
res ^= nums[i];
}
return res;
};
(3)方法三:二分法
代码:
/**
* @param {number[]} nums
* @return {number}
*/
var singleNonDuplicate = function(nums) {
// 方法三:二分法
const n = nums.length;
let l = 0, r = n - 1;
while(l < r) {
let mid = l + Math.floor((r-l) / 2);
// mid为偶数下标
if(mid % 2 === 0) {
if(nums[mid] === nums[mid+1]) {
// target在右边
l = mid + 1;
} else {
r = mid;
}
} else {
// mid为奇数下标
if(nums[mid] === nums[mid+1]) {
// target在左边
r = mid;
} else {
l = mid + 1;
}
}
}
return nums[l];
};
3、参考