leetcode
leetcode 1251 ~ 1300
6 和 9 组成的最大数字

6 和 9 组成的最大数字

难度:

标签:

题目描述

代码结果

运行时间: 20 ms, 内存: 16.0 MB


/*
 * 思路:
 * 1. 将数字转换为字符串,方便逐位处理。
 * 2. 使用Java Stream操作,找到第一个 '6' 并将其替换为 '9'。
 * 3. 将修改后的字符串转换回整数并返回。
 */

import java.util.stream.Collectors;

public class Solution {
    public int maximum69Number(int num) {
        // 将数字转换为字符串
        String numStr = String.valueOf(num);
        
        // 使用Stream替换第一个 '6' 为 '9'
        String result = numStr.chars()
                              .mapToObj(c -> (char) c)
                              .map(c -> c == '6' ? '9' : c)
                              .collect(StringBuilder::new, (sb, c) -> {
                                  if (sb.indexOf("6") != -1) {
                                      sb.append('9');
                                  } else {
                                      sb.append(c);
                                  }
                              }, StringBuilder::append)
                              .toString();
        
        // 将修改后的字符串转换回整数并返回
        return Integer.parseInt(result);
    }
}

解释

方法:

题解利用Python字符串的replace方法,将数字num转换为字符串,然后使用replace方法将第一个出现的字符'6'替换为'9'。这种方法直接寻找并替换第一个'6',确保得到的数字尽可能大。如果字符串中没有'6',则replace不会改变任何内容,直接返回原数字。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
题解中提到使用replace方法只替换第一个出现的'6',请问如果一个数字中存在多个'6',为什么只替换第一个'6'就能确保得到最大的数字?
在数字中,每一位的权重是基于它的位置,从右向左权重逐渐减小。因此,更靠左的数字对最终的数值影响更大。例如在数字696中,第一个'6'(百位的6)的权重是100,而第二个'6'(个位的6)的权重是1。将百位的'6'替换为'9'会使得数字增加300(即从600增加到900),这比将个位的'6'替换为'9'增加的3更有影响。因此,替换最左边的'6'可以确保得到可能的最大数字。
🦆
在题解中提到的replace方法,具体是怎样确定哪个'6'是第一个出现的?是否依赖于字符串从左到右的扫描顺序?
是的,字符串的处理通常依赖于从左到右的扫描顺序。在Python中,replace方法的工作机制也是从字符串的开始向后查找,直到找到第一个匹配的字符。在本题的情境中,replace('6', '9', 1)调用会从字符串的左端开始扫描,一旦找到第一个'6',它就会停止查找并将这个'6'替换为'9'。这保证了替换发生在数值最大化所需的最左边的'6'上。
🦆
在实际应用中,如果num的范围增大到非常大的数字,比如超过10^9,题解中的方法是否还适用,或者需要考虑其他优化方案?
题解中的方法,即将数字转换为字符串然后进行替换,理论上适用于任何大小的数字,只要数字可以被正常转换为字符串。Python的int类型不受固定字节大小的限制,而是可以根据需要使用更多的内存来存储更大的数值。因此,即便是超过10^9的数字,只要内存允许,这种方法依然有效。不过,对于极大数字的处理,替换操作的性能可能会受到影响,因为字符串的长度会增加,但对于本题的场景,这种影响通常是可以接受的。

相关问题