本篇博客会讲解力扣“1323. 6 和 9 组成的最大数字”的解题思路,这是题目链接。
对于这道题目,我会讲解2种解题思路,分别是直接操作整数,和利用字符串操作。希望大家通过本题学习关于整数和字符串的技巧。
显然,这道题要求我们找出一个整数最高位的6,并把这一位改成9。
思路1
对于一个整数,我们可以通过反复地“mod10除10”取出这个整数的每一位,比如:
1234 %10 = 4
1234 / 10 = 123
123 % 10 = 3
123 / 10 = 12
12 % 10 = 2
12 / 10 = 1
1 % 10 = 1
1 / 10 = 0
可以看到,通过反复地“mod10除10”,我们就把1234的每一位从右往左取出来了,即[4 3 2 1]。
我们可以从右往左把题目给我们的整数的每一位取出来,并且找到最高位的6,再把这一位改成9。具体的,我们需要用一个变量记录取出来的是从右往左的第几位,并维护一个变量max来记录最高位的6是第几位。
至于如何把最高位的6改成9也非常简单,比如,96996中最高位的6是从右往左的第3位(假设最右边那一位是第0位),我们只需要在这个整数的基础上加上3乘103,即3000即可。
int maximum69Number (int num){
int pos = 0; // 记录从右往左第几位,假设最低位是第0位
int max = -1; // 记录最高位的6是从右往左第几位
int ret = num;
// 取出num的每一位,找出最高位的6
while (num)
{
if (num % 10 == 6)
{
max = pos;
}
num /= 10;
++pos;
}
// 把最高位的6转换成9
if (max != -1)
{
ret += 3 * (int)pow(10, max);
}
return ret;
}
思路2
接下来讲解一个非常巧妙的解法,这需要运用字符串的相关知识。
首先我们需要了解到,我们可以使用sprintf函数把整数转换成字符串,也可以使用sscanf函数把字符串转换成整数。不了解这两个函数的朋友可以先阅读我的这篇博客。
我们还需要了解strchr函数,这个函数可以查找一个字符,如果找到了,就会返回最左边的这个字符的地址,否则返回NULL指针。
对于本题,我们可以进行如下操作:
- 使用sprintf函数,把题目给的整数转换成字符串。
- 使用strchr函数,找到这个字符串最左边的6。
- 把字符串最左边的6改成9。
- 使用sscanf函数,把字符串重新转换成整数,并返回。
int maximum69Number(int num) {
char ch[6];
// 把整数转换成字符串
sprintf(ch, "%d", num);
// 找到字符串中的第一个6,并改成9
char* cp = strchr(ch, '6');
if (cp)
{
*cp = '9';
}
// 把字符串重新转换成整数
int ret = 0;
sscanf(ch, "%d", &ret);
return ret;
}
总结
- 使用“mod10除10”的方法取出一个整数的每一位。
- 使用sprintf和sscanf把字符串和整数相互转换。
- 使用strchr函数查找字符串中的字符。
感谢大家的阅读!