C++小白修仙记_LeetCode刷题_1323 6 和 9 组成的最大数字
1323. 6 和 9 组成的最大数字
给你一个仅由数字 6 和 9 组成的正整数 num。
你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。
请返回你可以得到的最大数字。
示例:
输入:num = 9669
输出:9969
解释:
改变第一位数字可以得到 6669 。
改变第二位数字可以得到 9969 。
改变第三位数字可以得到 9699 。
改变第四位数字可以得到 9666 。
其中最大的数字是 9969 。
解法:贪心、字符串
class Solution {
public:
int maximum69Number (int num) {
string s = to_string(num);
for(char &ch : s)
{
if(ch == '6')
{
ch = '9';
break;
}
}
return atoi(s.c_str());
}
};
补充将字符串、数字互相转换的函数
int 转 string
通过 std::to_string() 函数转换
通过 ostringstream 转换
通过 sprintf 转换
string 转 int
通过 istringstream 转换
使用 sscanf 来转化
使用 atoi 转换
//int转string
//1.通过 std::to_string()函数转换
#include <iostream>
int main()
{
int num = 123;
std::cout << std:: to_string(num);
return 0;
}
//这种方式在 C++11 中才能使用,编译时记得加上 --std=c++11 的选项
//2.通过ostringstream转换
#include <iostream>
#include <sstream>
int main()
{
int num = 123;
std::ostringstream ss;
ss << num;
std::cout << ss.str();
return 0;
}
//这是一种通过字符流的方式将整数转换成字符串,这种方式在C++11之前也可以使用
//3.通过sprintf转换
#include <iostream>
int mian()
{
int num = 123;
char buffer[256];
sprintf(buffer,"%d",num);
printf("%s",buffer);
return 0;
}
//这是一种C语言中的转换方式,sprintf 也可以换成更安全的 snprintf 函数
//string转int
//1.通过istringstream转换
#include <iostream>
#include <sstream>
int main()
{
std::string str = "1000";
int num = 0;
std::istringstream ss(str);
ss >> num;
std::cout << num;
return 0;
}
//使用 istringstream 可以从字符流中读取整数,与 ostringstream 是一种相反的操作
//2.使用 sscanf 来转化
#include <iostream>
#include <stdio.h>
int main()
{
std::string str = "1000";
int num = 0;
sscanf(str.c_str(),"%d",&num);
std::cout << num;
return 0;
}
//注意 sscanf 函数的第一个参数类型是 const char *,string类型的参数需要用 c_str()函数 转换一下
//3.使用atoi转化
#include <iostream>
#include <stdlib.h>
int main()
{
std::string str = "1000";
std::cout << atoi(str.c_str());
return 0;
}
//atoi 函数的头文件是 stdlib.h,同样是一个C语言中的函数
解法:贪心、数学
思想:digit = 10的 log以10为底以num为真值 的次方 ,代表的是num的位数,如果最高位为6,则变9,如果最高位不是6,则把digit基值除以10,继续判断第一位是否为6,为6的话直接将 num 加 3 * digit,将6改为9,结果即为所求。
class Solution {
public:
int maximum69Number (int num) {
int digit = pow(10,(int)log10(num));
while(digit > 0)
{
if((num / digit) % 10 == 6) //最高位等于6
{
num += 3 * digit; //最高位 + 3000,最高位 6 变 9
return num;
}
digit /= 10;//最高位不为6,继续低一位进行判断
}
return num;
}
};