1. 问题描述:
给你一个仅由数字 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 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-69-number
2. 思路分析:
① 题目很好理解,我们需要求解的是从数字的高位开始找到第一个为6的数字然后将其修改为9即可,假如没有6那么不对数字做任何的改变,因为是从高位开始找到第一个数字为6,所以想到了使用递归来解决,利用到了层层返回的特点可以得到当前状态下的某些参数中,因为递归在层层返回的时候可以从高位开始计算,从高位开始发现第一个数字为6的那么直接对当前的数字修改为9即可,使用递归处理数字的时候其实是很方便的,因为它是既可以从低位开始计算,又可以从高位开始计算,假如我们在递归方法调用之前那么就可以从低位开始计算,假如递归方法之后那么就可以从高位开始计算结果非常方便,这里由于是从高位开始找到第一个数字6所以在递归方法之后计算结果
② 这里需要设置一个标志,发现第一个标志之后修改当前位置的数字为9,并且修改当前标志这样的话存在多个6的时候只会修改一次,递归的过程还是比较简单的,主要是分清楚在方法前计算还是方法后计算剩来的代码就比较简单了
③ 计算结果为上一次的结果 * 10再加上余数,以后再遇到这样的情况那么使用递归的话就很方便了,假如使用其他的方法的话会比较麻烦一点,因为像使用模拟的方法肯定是从低位开始计算余数的,这样肯定是错误的
3. 代码如下:
import java.util.Scanner;
public class Solution {
public int maximum69Number(int num) {
recursion(num);
return res;
}
int flag = 1, res = 0;
public void recursion(int num) {
if (num == 0) return;
int yushu = num % 10;
recursion(num / 10);
if (yushu == 6 && flag == 1){
yushu = 9;
flag = 0;
}
res = res * 10 + yushu;
}
}