6 和 9 组成的最大数字
给你一个仅由数字 6 和 9 组成的正整数 num。
你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。
请返回你可以得到的最大数字。
示例 1:
输入:num = 9669
输出:9969
解释: 改变第一位数字可以得到 6669 。
改变第二位数字可以得到 9969 。
改变第三位数字可以得到 9699 。
改变第四位数字可以得到 9666 。
其中最大的数字是 9969 。
一定要将思路想清楚了,走一遍代码,才能知道到底哪里出了错误。
首先对数进行分析,当然是将最左侧的数值换成9最好,但前提是找到最左侧的6.
提取最高位的数值的方法就是除以1000,100,10。(当然,结束条件不能以k是否为1作为结束标准,当所给数值最低位为6时,k=1时结束了就会造成数值漏加)
k初始值为1000,先num/k,判断最高位是否是6,如果是6,就将其转换为9,具体表现就是9*k,然后再加上num对k取余之后的数,即剩下的数不变,就可以得到最终的数,并跳出当前循环。
如果首位不是6,那么就需要判断下一位,这个时候n也应该加上9*k,然后将num赋值为num对k取余之后的值,相应k/10,判断下一位。
但是但是,一定要注意,使用这种方法的时候,当num/k为0的时候呢,n会加上本来不应该有的最高的位数,所以,直接将9*k改为(num/k)*k,这样,就是正确的了。
class Solution {
public int maximum69Number (int num) {
int n = 0;
int k=1000;
while(num!=0){
if(num/k==6){
n+=9*k+num%k;
break;
}
else{
n+=(num/k)*k;
}
num=num%k;
k/=10;
}
return n;
}
}
在if-else语句中还可以再加上点东西,使得判断更精确,当num/k为0的时候,就是num和k发生变化。
class Solution {
public int maximum69Number (int num) {
int n = 0;
int k=1000;
while(num!=0){
if(num/k==6){
n+=9*k+num%k;
break;
}
else if(num/k==0){
num=num%k;
k/=10;
}
else{
n+=9*k;
num=num%k;
k/=10;
}
}
return n;
}
}
当然还有其他的方法,可以将所给数值转换成字符数组,然后判断字符是否为‘6’或者‘9’,判断出来之后,直接进行修改就好,思路不想上面的方法那么复杂,因为转换的字符数组与数组分解开的位数是对应的。
看上去是简单题,但其实还是需要深入思考的。