6 和 9 组成的最大数字

标签: 贪心 数学

难度: Easy

给你一个仅由数字 6 和 9 组成的正整数 num

你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。

请返回你可以得到的最大数字。

示例 1:

输入:num = 9669
输出:9969
解释:
改变第一位数字可以得到 6669 。
改变第二位数字可以得到 9969 。
改变第三位数字可以得到 9699 。
改变第四位数字可以得到 9666 。
其中最大的数字是 9969 。

示例 2:

输入:num = 9996
输出:9999
解释:将最后一位从 6 变到 9,其结果 9999 是最大的数。

示例 3:

输入:num = 9999
输出:9999
解释:无需改变就已经是最大的数字了。

提示:

  • 1 <= num <= 10^4
  • num 每一位上的数字都是 6 或者 9 。

Submission

运行时间: 20 ms

内存: 16.0 MB

class Solution:
    def maximum69Number (self, num: int) -> int:
        return int(str(num).replace('6','9',1))

Explain

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

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def maximum69Number (self, num: int) -> int:
        # 将输入数字转换为字符串
        num_str = str(num)
        # 使用replace方法替换第一个'6'为'9'
        # 第三个参数1指定只替换第一个找到的实例
        result_str = num_str.replace('6', '9', 1)
        # 将结果字符串转换回整数并返回
        return int(result_str)

Explore

在数字中,每一位的权重是基于它的位置,从右向左权重逐渐减小。因此,更靠左的数字对最终的数值影响更大。例如在数字696中,第一个'6'(百位的6)的权重是100,而第二个'6'(个位的6)的权重是1。将百位的'6'替换为'9'会使得数字增加300(即从600增加到900),这比将个位的'6'替换为'9'增加的3更有影响。因此,替换最左边的'6'可以确保得到可能的最大数字。

是的,字符串的处理通常依赖于从左到右的扫描顺序。在Python中,replace方法的工作机制也是从字符串的开始向后查找,直到找到第一个匹配的字符。在本题的情境中,replace('6', '9', 1)调用会从字符串的左端开始扫描,一旦找到第一个'6',它就会停止查找并将这个'6'替换为'9'。这保证了替换发生在数值最大化所需的最左边的'6'上。

题解中的方法,即将数字转换为字符串然后进行替换,理论上适用于任何大小的数字,只要数字可以被正常转换为字符串。Python的int类型不受固定字节大小的限制,而是可以根据需要使用更多的内存来存储更大的数值。因此,即便是超过10^9的数字,只要内存允许,这种方法依然有效。不过,对于极大数字的处理,替换操作的性能可能会受到影响,因为字符串的长度会增加,但对于本题的场景,这种影响通常是可以接受的。