Easy
题目描述
给你一个包含正整数的整数数组 nums。我们定义一个函数 encrypt,使得 encrypt(x) 将 x 中的每个数字都替换为 x 中的最大数字。例如,encrypt(523) = 555 和 encrypt(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 <= 501 <= nums[i] <= 1000
提示:
- 加密数字的形式是
11…1 * maxDigit。
解题思路
这是一道简单的数组和数学题,需要理解加密规则并实现相应的转换。
解题思路:
理解加密规则:对于一个数字
x,encrypt(x)是将x的每一位都替换为x中的最大数字位。比如 523 的最大数字位是 5,所以每一位都变成 5,即 555。分解加密过程:
- 找到数字中的最大数字位
- 统计数字的位数
- 构造新的数字:最大数字位 × (111…1,位数个1)
具体实现步骤:
- 遍历数组中的每个数字
- 对每个数字进行加密转换
- 累计所有加密后数字的和
加密算法细节:
- 提取数字的每一位,找到最大值
- 计算位数
- 构造结果:
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) | 只使用了常数级别的额外空间 |