美文网首页
leetcode算法练习- 只出现一次的数字

leetcode算法练习- 只出现一次的数字

作者: 土豪码农 | 来源:发表于2019-03-21 08:35 被阅读0次

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

第一次提交

想到的办法是先排序,然后就遍历,排序之后,(0,1),(2,3)(4,5)肯定是一样依次类推,不一样说明就找到了不重复的那个数

var singleNumber = function(nums) {
    nums.sort();
    let num = 0;
    for (let i = 0; i < nums.length; i+=2) {
      if(i === nums.length-1){
        num = nums[i];
        break;
      }
      if(nums[i] !== nums[i+1]){
        num =  nums[i];
        break;
      }
    }
    return num;
  };
QQ截图20190321080750.png

第二次提交

第二次提交和第一次差不多,只是第一次是一个个找,遍历,第二次用二分法尝试找找看,不过结果性能并没有优化..

  var singleNumber = function (nums) {
    nums.sort();
    return two(nums);
  };

  function two(nums) {
    if (nums.length === 1)return nums[0];
    let i = parseInt((nums.length - 1) / 2);
    const oddFlag = i % 2 !== 0;
    if (oddFlag) {
      if (nums[i] === nums[i - 1]) {
        nums.splice(0, i + 1);
        return two(nums);
      } else if (i === 0 || nums[i + 1] !== nums[i]) {
        return nums[i]
      } else {
        nums.splice(i , nums.length - i );
        return two(nums);
      }
    } else {
      if (nums[i] === nums[i + 1]) {
        nums.splice(0, i + 2);
        return two(nums);
      } else if (i === 0 || nums[i - 1] !== nums[i]) {
        return nums[i]
      } else {
        nums.splice(i + 1, nums.length - i - 1);
        return two(nums);
      }
    }
  }
QQ截图20190321081845.png

最佳实现

容我细细品味

var singleNumber = function(nums) {
    for (var i = 1; i < nums.length; i++) {
        nums[0] = nums[0] ^ nums[i];
    }
    return nums[0];
};

相关文章

网友评论

      本文标题:leetcode算法练习- 只出现一次的数字

      本文链接:https://www.haomeiwen.com/subject/cpsfvqtx.html