算法-求次数问题汇总

leetcode136:只出现一次的数字

解题思路:

  • 哈希
  • 异或
  • reduce(只是异或的一种简写形式)

 1、哈希:如果有则表示不是我们想要的,那就删除 set 中的这个元素,如果没有就将这个元素加入到 set 中。

var singleNumber = function (nums) {
  const set = new Set()
  for (let i = 0; i < nums.length; i++) {
    set.has(nums[i]) ? set.delete(nums[i]) : set.add(nums[i]) 
  }
  return [...set][0]
};

2、异或:0与任何数异或结果不变, 两个相同的数异或为0

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

3、reduce:reduce 方法实现的原理也是异或, 我们只是利用它的 API 特性,它刚好能够简化我们第二种方法的代码

//reduce 的中传入的函数的第一个参数 pre 初始值是 0 刚好满足要求
var singleNumber = function (nums) {
  return nums.reduce((pre, cur) => pre ^ cur)
};

leetcode137:只出现一次的数字II

解题思路:

  • 哈希+求和法
  • 双层遍历
var singleNumber = function (nums) {
  let set = new Set();
  let setsum = 0;
  let numsum = 0;
  for (let x of nums) {
    //所有元素的和
    numsum += x;
    if (!set.has(x)) {
      setsum += x;//2->5
    }
    //HashSet内元素的和
    set.add(x);
  }
  //返回值
  return (3 * setsum - numsum) / 2;
};
//双层循环

var singleNumber = function (nums) {
  for (let i = 0; i < nums.length; i++) {
    var index = 0
    for (let j = 0; j < nums.length; j++) {
      if (nums[i] == nums[j]) index++
    }
    if (index < 3) return nums[i]
  }
};

leetcode260:只出现一次的数字 III

解题思路:

  • 这个做法和我们第一题的做法一致, 只要理解了第一题的做法, 这个很容易就能写出来, 有一点不同的是, 第一题的 HashSet 里面最后保留了一个元素, 该题保留两个元素。

  • 位运算会写了再补充

var singleNumber = function (nums) {
  let set = new Set()
  for (const x of nums) {
    set.has(x) ? set.delete(x) : set.add(x)
  }
  return [...set]
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值