- 掘金团队号上线,助你 Offer 临门! 点击 查看活动详情
本题核心
3个姐法,三倍的快乐~(^▽^)
题目描述
给你一个整数数组 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
解题思路
姐法1 桶/固定长度数组
一眼看到输入数组长度为固定1~100,那么我首先想到的是桶来解决这个问题。即通过101个桶,循环遍历nums,往桶里自增,最后循环把桶里面等于1,也就是出现一次的元素累计得出结果。
姐法2 HashMap
单次循环,利用HashMap的数据结构特性来统计只出现一次的问题。当nums中的数不在HashMap中时,往里put数据,并累加到count上,如果nums在HashMap中,则用count再减去该数值。最后单次循环的结果count就是只出现过一次的元素的总和。
姐法3 双循环
双循环比对每一个元素与数组中另一个元素是否相同,如果相同,跳出循环。如果比对完所有元素依然不同则只出现过一次,进行累加。
解题代码
姐法1
public int sumOfUnique(int[] nums) {
int count = 0;
int[] buckets = new int[101];
for (int num : nums) {
buckets[num] = buckets[num] + 1;//把nums有的元素装进buckets数组里
}
for (int i = 0; i < buckets.length; i++) {
if (buckets[i] == 1) {//只把数组为值为1的下标元素累加起来
count += i;
}
}
return count;
}
姐法2
public int sumOfUnique(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
HashMap<Integer, Integer> map = new HashMap<>();
int count = 0;
for (int num : nums) {
Integer value = map.get(num);
if (value == null) {//
count += num;
map.put(num, 1);
} else if (value > 0) {
count -= num;
map.put(num, 0);
}
}
return count;
}
姐法3
public int sumOfUnique(int[] nums) {
int n = nums.length;
if (n == 1) {
return nums[0];
}
int res = 0;
for (int i = 0; i < n; i++) {
boolean dup = false;
for (int j = 0; j < n; j++) {
if (i != j && nums[i] == nums[j]) {
dup = true;
break;
}
}
if (!dup) {
res += nums[i];
}
}
return res;
}
##总结
每多思考一种姐法,你就多一种姐法的快乐。~骑士君,ヾ(◍°∇°◍)ノ゙加油啊