目录
题目链接:2535. 数组元素和与数字和的绝对差 - 力扣(LeetCode)
题目链接:2535. 数组元素和与数字和的绝对差 - 力扣(LeetCode)
注:下述题目描述和示例均来自力扣
题目描述
给你一个正整数数组 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 <= 2000
1 <= nums[i] <= 2000
解法一:爱装的暴力
- 初始化两个变量,nuSum(数字和)和elSum(元素和),初始值都为0。
- 遍历数组中的每个元素num。
- 将当前元素num累加到elSum中,即计算元素和。
- 使用while循环拆分当前元素num的各个数字,并将这些数字累加到nuSum中,即计算数字和。
- 打印出元素和elSum和数字和nuSum的值。
- 返回元素和elSum与数字和nuSum之间的差值的绝对值。
Java写法:
class Solution {
public int differenceOfSum(int[] nums) {
// 元素和
int nuSum = 0;
// 数字和
int elSum = 0;
for(int num: nums){
elSum += num;
// 拆分数字和的数字
while(num > 0){
nuSum += num % 10;
num /= 10;
}
}
System.out.println(elSum + ":" + nuSum);
return elSum - nuSum > 0 ? elSum - nuSum : nuSum - elSum;
}
}
运行时间
C++写法:
class Solution {
public:
int differenceOfSum(std::vector<int>& nums) {
// 元素和
int nuSum = 0;
// 数字和
int elSum = 0;
for (int num : nums) {
elSum += num;
// 拆分数字和的数字
while (num > 0) {
nuSum += num % 10;
num /= 10;
}
}
std::cout << elSum << ":" << nuSum << std::endl;
return elSum - nuSum > 0 ? elSum - nuSum : nuSum - elSum;
}
};
运行时间
时间复杂度和空间复杂度
解法二:纯粹的暴力
这种解法是一种暴力解法,它通过遍历数组中的每个元素,然后对每个元素进行处理。具体来说,对于每个大于9的元素,它会将其累加到结果变量res中,同时计算该元素的各位数字之和并累加到sum变量中。然后将sum从res中减去,并将sum重置为0。最后返回res作为结果。
这种解法可能会更快一些,因为它避免了额外的函数调用和复杂的逻辑判断。在循环内部,它直接处理每个元素,没有额外的函数调用或条件判断。此外,由于它只遍历一次数组,所以时间复杂度为O(n),其中n是数组的长度。这使得它在处理较小的数组时可能比使用其他算法更快。
Java写法:
class Solution {
public int differenceOfSum(int[] nums) {
int sum = 0;
int res = 0;
for(int num : nums){
if(num>9){
res += num;
while(num > 9){
sum += num % 10;
num /= 10;
}
sum += num;
res -= sum;
sum = 0;
}
}
return res;
}
}
运行时间
C++写法:
#include <iostream>
#include <vector>
class Solution {
public:
int differenceOfSum(std::vector<int>& nums) {
int sum = 0;
int res = 0;
for (int num : nums) {
if (num > 9) {
res += num;
while (num > 9) {
sum += num % 10;
num /= 10;
}
sum += num;
res -= sum;
sum = 0;
}
}
return res;
}
};
运行时间
时间复杂度和空间复杂度
总结
呃,置于为什么这俩方法时间复杂度和空间复杂度都一样还能第二种写的乱一点的(纯粹的暴力)方法要快一些,我真的不理解别问我了,可能的解释是因为它避免了额外的函数调用和复杂的逻辑判断。在循环内部,它直接处理每个元素,没有额外的函数调用或条件判断。