持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
好好学习,天天刷题~~
今日份刷题【只出现一次的数字】记录如下:
题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
解法一
题解方法:首先先将数组排序,定义两个变量,间隔为1,从左往右比较,如果前后两个相等,则这两个变量继续往右移动2位,继续比较下一组,一直到那一组前后两个值不相等,则返回前面的值。具体代码参考如下:
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
nums.sort();
var left=0;
var right=1;
while(right>0){
if(nums[left]==nums[right]){
left+=2;
right+=2;
}else{
return nums[left];
}
}
};
提交结果如下:
解法二
这道题的前提条件为:【除了某个元素只出现一次以外,其余每个元素均出现两次】,那么我们可以使用位运算。
总所周知:
a^a=0;
a^0=a;
0^a=0;
0^0=0;
a^b=b^c;
总结而言就是:自己异或自己就会等于0,任何数字异或0都会等于他本身,而且,异或也具有交换律。
那么根据以上规律和这道题的前提条件,我们就可以用异或很简单的解决:就是我们可以将所有的数字异或一遍,那么我们就能最终找到那个只出现一次的那个元素。具体代码参考如下:
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
var a=0;
for(var i=0;i<nums.length;i++){
a=a^nums[i];
}
return a;
};
提交结果如下: