这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情
问题描述
给你一个正整数数组 nums 。
- 元素和 是
nums中的所有元素相加求和。 - 数字和 是
nums中每一个元素的每一数位(重复数位需多次求和)相加求和。
返回 元素和 与 数字和 的绝对差。
注意: 两个整数 x 和 y 的绝对差定义为 |x - y| 。
示例 1:
输入: nums = [1,15,6,3]
输出: 9
解释:
nums 的元素和是 1 + 15 + 6 + 3 = 25 。
nums 的数字和是 1 + 1 + 5 + 6 + 3 = 16 。
元素和与数字和的绝对差是 |25 - 16| = 9 。
示例 2:
输入: nums = [1,2,3,4]
输出: 0
解释:
nums 的元素和是 1 + 2 + 3 + 4 = 10 。
nums 的数字和是 1 + 2 + 3 + 4 = 10 。
元素和与数字和的绝对差是 |10 - 10| = 0 。
提示:
1 <= nums.length <= 20001 <= nums[i] <= 2000
思路分析
首先我们先要理解一下题目意思,题目会给我们一个正整数数组nums,我们需要计算 元素和 与 数字和 的绝对差,元素和 与 数字和的具体定义如下:
- 元素和 是
nums中的所有元素相加求和。 - 数字和 是
nums中每一个元素的每一数位(重复数位需多次求和)相加求和。
我们可以遍历数组nums,计算每一个元素的元素值与其数字和之差的绝对值,最后求出所有元素的元素值与其数字和之差的绝对值的和即是题目所有求的答案。
- 求出每个元素的元素值与其数字和之差的绝对值
我们可以通过取余数的方法来求出元素的每个数位的数字之和,每次取出元素的余数并将元素整除于10,直到该元素值为0时即可得出该元素所有数位的数字和,具体代码如下:
let temp = num;
while(num > 0){
temp -= num % 10;
num = Math.floor(num / 10);
}
res += Math.abs(temp);
- 求出所有元素的元素值与其数字和之差的绝对值的和
我们只需要遍历数组的每一个元素,对每一个元素进行求数字和的操作即可,具体代码如下:
for(let num of nums){
let temp = num;
while(num > 0){
temp -= num % 10;
num = Math.floor(num / 10);
}
res += Math.abs(temp);
}
完整 AC 代码如下:
AC 代码
/**
* @param {number[]} nums
* @return {number}
*/
var differenceOfSum = function(nums) {
let res = 0;
for(let num of nums){
let temp = num;
while(num > 0){
temp -= num % 10;
num = Math.floor(num / 10);
}
res += Math.abs(temp);
}
return res;
};
说在后面
本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。