1748. 唯一元素的和

101 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 <= 100
  • 1 <= nums[i] <= 100

思路

  • 第一种
    • 遍历整个数组,找到所有不重复的元素,添加到空数组中,这里用的indexOflastIndexOf判断数字是不是在数组中出现一次
    • 用数组的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;
};