返回

LeetCode 137:只出现一次的数字II - JavaScript三大解法逐个击破

前端

哈希表:快速高效,空间换时间

哈希表是一种以键值对形式存储数据的结构,它以极快的查找速度而著称。在解决本题时,我们可以利用哈希表来记录每个元素出现的次数。当遍历数组时,我们将每个元素作为键,其出现次数作为值,并存储在哈希表中。最后,遍历哈希表并找出键为 1 的元素,即可获得只出现一次的数字。

JavaScript 代码实现:

const singleNumber = (nums) => {
  const hash = {};
  for (const num of nums) {
    if (hash[num]) {
      hash[num]++;
    } else {
      hash[num] = 1;
    }
  }
  for (const num in hash) {
    if (hash[num] === 1) {
      return num;
    }
  }
};

数学技巧:异或运算巧思

异或运算(XOR)具有交换律、结合律和自反性,还可以用来解决本题。由于每个元素只出现两次,因此只出现一次的数字与其他元素进行异或运算的结果就是该数字本身。而异或运算的另一个特性是,相同数字异或的结果为 0。

JavaScript 代码实现:

const singleNumber = (nums) => {
  let result = 0;
  for (const num of nums) {
    result ^= num;
  }
  return result;
};

位运算:精妙简洁,一网打尽

位运算是一种直接对二进制位进行操作的运算,它以其简洁高效的特性而著称。在解决本题时,我们可以利用位运算来统计每个元素二进制位上 1 的个数。由于只出现一次的数字在二进制位上 1 的个数为 1,而其他元素为 2 或以上,因此我们可以通过统计二进制位上 1 的个数来找出只出现一次的数字。

JavaScript 代码实现:

const singleNumber = (nums) => {
  let ones = 0;
  let twos = 0;
  for (const num of nums) {
    ones = (ones ^ num) & ~twos;
    twos = (twos ^ num) & ~ones;
  }
  return ones;
};

结束语:

针对「LeetCode 137:只出现一次的数字II」难题,我们介绍了三种不同的算法——哈希表、数学技巧、位运算。每种算法都有其独特的优势和应用场景。哈希表快速高效,空间换时间;数学技巧巧妙简洁,一针见血;位运算精妙简洁,一网打尽。作为JavaScript编程学习者,掌握这三种算法,将极大提升你的算法技能和解决问题的思维广度。