每日算法【数组】 - 只出现一次的数字

73 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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];
      }
    }
};

提交结果如下:

image.png

解法二

这道题的前提条件为:【除了某个元素只出现一次以外,其余每个元素均出现两次】,那么我们可以使用位运算。

总所周知:

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;

};

提交结果如下: image.png