leetcode
leetcode 2751 ~ 2800
求出加密整数的和

求出加密整数的和

难度:

标签:

题目描述

You are given an integer array nums containing positive integers. We define a function encrypt such that encrypt(x) replaces every digit in x with the largest digit in x. For example, encrypt(523) = 555 and encrypt(213) = 333.

Return the sum of encrypted elements.

 

Example 1:

Input: nums = [1,2,3]

Output: 6

Explanation: The encrypted elements are [1,2,3]. The sum of encrypted elements is 1 + 2 + 3 == 6.

Example 2:

Input: nums = [10,21,31]

Output: 66

Explanation: The encrypted elements are [11,22,33]. The sum of encrypted elements is 11 + 22 + 33 == 66.

 

Constraints:

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

代码结果

运行时间: 27 ms, 内存: 16.1 MB


/*
题目思路:
1. 使用Java Stream处理数组。
2. 对于每个整数,找到其最大的数位并用它替换所有数位。
3. 使用map和sum来计算加密后的总和。
*/

import java.util.Arrays;

public class EncryptSumStream {
    public static int encrypt(int[] nums) {
        return Arrays.stream(nums)
            .map(num -> {
                int maxDigit = String.valueOf(num).chars()
                    .map(Character::getNumericValue)
                    .max()
                    .orElse(0);
                String encryptedStr = String.valueOf(maxDigit).repeat(String.valueOf(num).length());
                return Integer.parseInt(encryptedStr);
            })
            .sum();
    }

    public static void main(String[] args) {
        int[] nums = {10, 21, 31};
        System.out.println(encrypt(nums)); // 输出 66
    }
}

解释

方法:

这道题目的解法是通过定义一个加密函数`en`,该函数接收一个整数`x`,将其转换为字符串`xx`,然后找出`xx`中的最大数字`xxx`,并用`xxx`替换`xx`中的每个数字,最后将得到的字符串`xxxx`转换回整数并返回。解法的主体部分是对输入数组`nums`中的每个元素应用`en`函数,并将结果相加返回。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在定义加密函数`en`时,为什么选择将整数转换为字符串来处理而不是直接进行数学运算?
将整数转换为字符串是为了便于访问和操作每一位数字。在数学运算中,处理数字的每一位相对复杂,涉及到循环和除以10的操作来分离每一位。而字符串提供了直接访问每个字符的简单方法,且可直接使用内置函数如`max`来找出最大的字符。因此,使用字符串处理在这种情况下更直观且易于实现。
🦆
函数`en`中使用`max(xx)`来找最大数字,这种方法是否在所有情况下都有效,比如数字开头是0的情况?
函数`en`中使用`max(xx)`来找最大数字在所有情况下都是有效的。即使数字的字符串表示以0开头,`max`函数仍然正确地返回字符串中的最大数字。由于`max`函数是按字符的ASCII值进行比较的,数字字符'0'到'9'的ASCII值是连续的,并且'0'是最小的,所以即使是以'0'开头的数字,`max`也能正确找到最大的数字字符。
🦆
在`en`函数中,你是如何确定将整个字符串的每个字符替换为最大值后再转换回整数不会超出整数范围?
在`en`函数中,将整个字符串的每个字符替换为最大值后再转换回整数通常不会超出Python中整数的范围。Python的整数类型是动态的,可以处理非常大的数值,只受限于系统的内存。即使将字符串中的每个字符都替换为'9'(最大的单个数字字符),形成的新字符串所代表的整数值在绝大多数情况下仍在处理范围内。因此,通常不需要担心整数溢出问题。

相关问题