开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
题目 leetcode.cn/
- 给你一个整数数组
nums。数组中唯一元素是那些只出现 恰好一次 的元素。 - 请你返回
nums中唯一元素的 和 。
示例
输入:nums = [1,2,3,2],输出:4解释:唯一元素为 [1,3] ,和为 4 。
输入:nums = [1,1,1,1,1],输出:0解释:没有唯一元素,和为 0
输入:nums = [1,2,3,4,5],输出:15解释:唯一元素为 [1,2,3,4,5] ,和为 15 。
提示
1 <= nums.length <= 1001 <= nums[i] <= 100
思路
- 第一种
- 遍历整个数组,找到所有不重复的元素,添加到空数组中,这里用的
indexOf和lastIndexOf判断数字是不是在数组中出现一次 - 用数组的
reduce方法对所有不重复的数字求和,然后返回结果 - 如果数组长度为
1,直接返回第一项
- 遍历整个数组,找到所有不重复的元素,添加到空数组中,这里用的
function sumOfUnique(nums: number[]): number {
if(nums.length === 1) return nums[0];
let result = [];
for(let i = 0; i < nums.length; i++){
if(nums.indexOf(nums[i]) === nums.lastIndexOf(nums[i])){
result.push(nums[i]);
}
}
let sum = result.reduce((next, pre) => {
return next + pre;
}, 0);
return sum;
};
- 第二种
- 首先对数组排序,升序降序都可以
- 排序后的数组,如果数字有重复项,那么重复项一定在其左边或者右边
- 遍历数组,判断数字的左右两边的值是否等于当前值,如果都不相等,那么当前值一定是唯一不重复的,计算进结果中
- 注意下遍历的取值范围边界问题,包括对首项和末尾项的判断取值
- 如果数组长度为
1,直接返回第一项
function sumOfUnique(nums: number[]): number {
if(nums.length === 1) return nums[0];
let sum = 0;
let sortNums = nums.sort((a, b) => { return a - b; });
for(let i = 1; i < sortNums.length - 1; i++){
if(sortNums[i-1] !== sortNums[i] && sortNums[i] !== sortNums[i+1]){
sum+=sortNums[i];
}
};
if(sortNums[0] !== sortNums[1]) sum += sortNums[0];
if(sortNums[sortNums.length - 1] !== sortNums[sortNums.length - 2]) sum += sortNums[sortNums.length - 1];
return sum;
};