leetcode刷题记录-1748. 唯一元素的和

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

前言

今日的题目为简单,题型和前几天出现过的884. 两句话中的不常见单词十分相似,有着一样的优化思路

每日一题

今天的每日一题 1748. 唯一元素的和,难度为简单

  • 给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。

  • 请你返回 nums 中唯一元素的 和 。

示例 1:

输入:nums = [1,2,3,2]
输出:4
解释:唯一元素为 [1,3] ,和为 4复制代码

示例 2:

输入:nums = [1,1,1,1,1]
输出:0
解释:没有唯一元素,和为 0复制代码

示例 3 :

输入:nums = [1,2,3,4,5]
输出:15
解释:唯一元素为 [1,2,3,4,5] ,和为 15复制代码

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100

题解

哈希表

用一个哈希表保存下每一个元素出现的次数,之后再遍历一次哈希表,把只出现过一次的数加起来,就能得到题目需要的答案

/**
 * @param {number[]} nums
 * @return {number}
 */
var sumOfUnique = function (nums) {
  const map = new Map();
  let ans = 0;
  for (const num of nums) {
    map.set(num, (map.get(num) || 0) + 1);
  }
  for (const [key ,val] of map.entries()) {
    if (val == 1) {
      ans += key;
    }
  }
  return ans;
};
复制代码

image.png

优化 - 一次遍历

上面的哈希表解题需要遍历一遍数组和一遍哈希表,我们需要两次遍历,接下去可以对其进行优化,只需要遍历一次就够了。

这样的解法和之前的每日一题884. 两句话中的不常见单词很相似,之前就有使用过这种解法:

leetcode刷题记录-884. 两句话中的不常见单词

我们就只需要遍历一遍数组,将未出现过的单词都添加进一个哈希表并且设置两种情况:

  1. 出现过的数的值为1,并且添加入答案的总数中
  2. 出现超过两次的数的值都为2,并且从答案总数中减去这个数
/**
 * @param {number[]} nums
 * @return {number}
 */
var sumOfUnique = function(nums) {
  let ans = 0;
  const map = new Map();
  for (const num of nums) {
      if (!map.has(num)) {
          ans += num;
          map.set(num, 1);
      } else if (map.get(num) === 1) {
          ans -= num;
          map.set(num, 2);
      }
  }
  return ans;
};
复制代码

image.png

Guess you like

Origin juejin.im/post/7061522211848323103