0%

6和9组成的最大数字

题目地址

难度:

题目描述:

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

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

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

示例1:

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

示例2:

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

示例3:

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

提示:

  • 1 <= num <= 10^4
  • num 每一位上的数字都是 6 或者 9 。
🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️解题过程🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️
解题过程:

思路:

将整数转成字符串,若存在字符’6’,则把左边第一个字符’6’变成’9’,这样可以得到最大数字。

c++代码:(执行用时0ms,击败100.00%,内存消耗6.1M,击败29.03%)

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int maximum69Number (int num) {
//int转string
string s=to_string(num);
//把左边第一个6转成9
if(s.find('6')!=string::npos){
s[s.find('6')]='9';
}
//string转int,atoi是标准库函数
return atoi(s.c_str());
}
};
💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎官 方 题 解💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎
官方题解:

方法一: 模拟

现在把 9 翻转成 6 是不合理的,因为它会使得数字变小。因此我们应当找到 num 中最高位的 6,将其翻转成 9

c++代码:(执行用时0ms,击败100.00%,内存消耗6.2M,击败11.53%)

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int maximum69Number(int num) {
string s = to_string(num);
for (char& ch: s) {
if (ch == '6') {
ch = '9';
break;
}
}
return stoi(s);
}
};

复杂度分析

  • 时间复杂度:$O(\log \textit{num})$,表示 $\textit{num}$ 的位数。

  • 空间复杂度:$O(\log \textit{num})$。为了代码编写方便,我们使用额外的字符串来存储 $\textit{num}$,使得可以直接修改特定位置的数字。

🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓知 识 点🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓🎓
知识点:

atoi()和stoi()的区别

相同点:

  1. 都是C++字符处理函数,把数字字符串转换成int输出
  2. 头文件都是#include\

不同点:

  1. atoi()的参数是 const char ,因此对于一个字符串str我们必须调用 c_str()的方法把这个string转换成 const char\类型的,而stoi()的参数是const string*,不需要转化为 const char*;
  2. stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error!而atoi()不会做范围检查,如果超出范围的话,超出上界,则输出上界,超出下界,则输出下界;
⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳总 结⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳
总结:

模拟解题,需要注意字符串转整数的两个函数stoi()和atoi()的使用。

------------- THE END! THANKS! -------------