【LeetCode每日一题】1748. 唯一元素的和

106 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。

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

题解

方法一:最普通的做法就是用数组去记录这个数出现了多少次,然后再遍历一次循环,把出现一次的数加起来就是答案

class Solution {
public:
    int sumOfUnique(vector<int>& nums) {
        int ans[1000];
        for(int i=0;i<1000;i++)
        ans[i]=0;
       int n=nums.size();
       for(int i=0;i<n;++i){
           ans[nums[i]]++;
       }
       int sum=0;
       for(int i=0;i<n;++i){
           if(ans[nums[i]]==1)
           sum+=nums[i];
       }
       return sum;
​
    }
};

方法二: 用一个哈希表记录每个元素值出现的次数,然后变量哈希表,累加出现一次的元素值就是所需要求得的最终答案。

class Solution {
public:
    int sumOfUnique(vector<int> &nums) {
        map<int, int> cnt;
      //  for(int num=0;num<nums.size();num++)
     //   ++cnt[nums[num]];//这两行的代码与下面两行代码意思完全一样
        for (auto num : nums) {
            ++cnt[num];
        }
        int ans = 0;
        for (auto &[num, c] : cnt) {
            if (c == 1) {
                ans += num;
            }
        }
        return ans;
    }
};
​

方法三: 一次遍历+记录每个元素的状态

我们在遍历的时候给每个元素赋予一个状态

  • 0:该元素尚未被访问
  • 1:该元素被访问过一次
  • 2:改元素被访问超过一次

很简单的思想

class Solution {
public:
    int sumOfUnique(vector<int> &nums) {
        int ans = 0;
        unordered_map<int, int> state;
        for (int num : nums) {
            if (state[num] == 0) {
                ans += num;
                state[num] = 1;
            } else if (state[num] == 1) {
                ans -= num;
                state[num] = 2;
            }
        }
        return ans;
    }
};