Easy

题目描述

给你一个包含正整数的整数数组 nums。我们定义一个函数 encrypt,使得 encrypt(x)x 中的每个数字都替换为 x 中的最大数字。例如,encrypt(523) = 555encrypt(213) = 333

返回加密后元素的和。

示例 1:

输入:nums = [1,2,3]
输出:6
解释:加密后的元素是 [1,2,3]。加密元素的和是 1 + 2 + 3 == 6。

示例 2:

输入:nums = [10,21,31]
输出:66
解释:加密后的元素是 [11,22,33]。加密元素的和是 11 + 22 + 33 == 66。

约束条件:

  • 1 <= nums.length <= 50
  • 1 <= nums[i] <= 1000

提示:

  • 加密数字的形式是 11…1 * maxDigit

解题思路

这是一道简单的数组和数学题,需要理解加密规则并实现相应的转换。

解题思路:

  1. 理解加密规则:对于一个数字 xencrypt(x) 是将 x 的每一位都替换为 x 中的最大数字位。比如 523 的最大数字位是 5,所以每一位都变成 5,即 555。

  2. 分解加密过程

    • 找到数字中的最大数字位
    • 统计数字的位数
    • 构造新的数字:最大数字位 × (111…1,位数个1)
  3. 具体实现步骤

    • 遍历数组中的每个数字
    • 对每个数字进行加密转换
    • 累计所有加密后数字的和
  4. 加密算法细节

    • 提取数字的每一位,找到最大值
    • 计算位数
    • 构造结果:maxDigit × (10^位数 - 1) / 9(这是 111…1 的数学表达式)

这种方法时间复杂度为 O(n×d),其中 n 是数组长度,d 是数字的最大位数。空间复杂度为 O(1)。

代码实现

class Solution {
public:
    int sumOfEncryptedInt(vector<int>& nums) {
        int sum = 0;
        for (int num : nums) {
            sum += encrypt(num);
        }
        return sum;
    }
    
private:
    int encrypt(int x) {
        int maxDigit = 0;
        int digits = 0;
        int temp = x;
        
        while (temp > 0) {
            maxDigit = max(maxDigit, temp % 10);
            temp /= 10;
            digits++;
        }
        
        int result = 0;
        for (int i = 0; i < digits; i++) {
            result = result * 10 + maxDigit;
        }
        return result;
    }
};
class Solution:
    def sumOfEncryptedInt(self, nums: List[int]) -> int:
        def encrypt(x):
            str_x = str(x)
            max_digit = max(str_x)
            return int(max_digit * len(str_x))
        
        return sum(encrypt(num) for num in nums)
public class Solution {
    public int SumOfEncryptedInt(int[] nums) {
        int sum = 0;
        foreach (int num in nums) {
            sum += Encrypt(num);
        }
        return sum;
    }
    
    private int Encrypt(int x) {
        string strX = x.ToString();
        char maxDigit = strX.Max();
        return int.Parse(new string(maxDigit, strX.Length));
    }
}
var sumOfEncryptedInt = function(nums) {
    function encrypt(x) {
        const str = x.toString();
        const maxDigit = Math.max(...str.split('').map(Number));
        return parseInt(maxDigit.toString().repeat(str.length));
    }
    
    return nums.reduce((sum, num) => sum + encrypt(num), 0);
};

复杂度分析

复杂度类型复杂度说明
时间复杂度O(n×d)n 是数组长度,d 是数字的最大位数(最多3位)
空间复杂度O(1)只使用了常数级别的额外空间

相关题目