每日算法-只出现一次的数字(数学-简单)

678 阅读2分钟

题目一:只出现一次的数字 I

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

说明:

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

示例 1:

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

示例 2:

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

方法一:位异或 XOR

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) { // XOR 运算满足交换律和结合律:aba = (aa)⊕b = 0b = b
  let ans = 0;
  for(const num of nums) {
      ans ^= num;  // 00000 0010 ^ 00000 0010 = 0000 0010
  }
  return ans;
};

方法二:

var singleNumber = function(nums) {
  let set = new Set();
  for(let i = 0 ,lenght = nums.length ; i< lenght ; i++ ) {
      if(set.has(nums[i])) {
          set.delete(nums[i]);   // 第二次出现的数都会被删除
          continue;        
      }
      set.add(nums[i]);
  }
  return [...set];
};

题目二: 只出现一次的数字 II

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

说明:

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

示例 1:

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

示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

方法一:循环+indexOf

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
  for(let i=0;i<nums.length;++i){
      if(nums.indexOf(nums[i],i+1)==-1&&nums.indexOf(nums[i])==i){ // 存在一个
          return nums[i]
      }
  }
};

方法二:排序+数学

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
  nums.sort((a,b)=>a-b);
  for(let i=0;i<nums.length;i+=3){
      if(nums[i] != nums[i+1]) return nums[i];
  }
};

总结

  • 这种类型的题目,可以借助javascript的语法去解决,或者借助数学的方式解决。并没有特别好的数据结构和算法去解决。