力扣每日一题——数组元素和与数字和的绝对差

目录

题目链接:2535. 数组元素和与数字和的绝对差 - 力扣(LeetCode)

题目描述

示例

提示:

解法一:爱装的暴力

Java写法:

运行时间

C++写法:

运行时间

时间复杂度和空间复杂度

解法二:纯粹的暴力

Java写法:

运行时间

C++写法:

运行时间

时间复杂度和空间复杂度

总结


题目链接: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


解法一:爱装的暴力

  1. 初始化两个变量,nuSum(数字和)和elSum(元素和),初始值都为0。
  2. 遍历数组中的每个元素num。
  3. 将当前元素num累加到elSum中,即计算元素和。
  4. 使用while循环拆分当前元素num的各个数字,并将这些数字累加到nuSum中,即计算数字和。
  5. 打印出元素和elSum和数字和nuSum的值。
  6. 返回元素和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;
    }
};

运行时间

时间复杂度和空间复杂度


总结

        呃,置于为什么这俩方法时间复杂度和空间复杂度都一样还能第二种写的乱一点的(纯粹的暴力)方法要快一些,我真的不理解别问我了,可能的解释是因为它避免了额外的函数调用和复杂的逻辑判断。在循环内部,它直接处理每个元素,没有额外的函数调用或条件判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WenJGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值