持续创作,加速成长!这是我参与「掘金日新计划 · 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 <= 1001 <= 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;
}
};