探索极限:利用整数或字符串操作找出翻转后的最大数字

本篇博客会讲解力扣"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即可。

c 复制代码
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指针。

对于本题,我们可以进行如下操作:

  1. 使用sprintf函数,把题目给的整数转换成字符串。
  2. 使用strchr函数,找到这个字符串最左边的6。
  3. 把字符串最左边的6改成9。
  4. 使用sscanf函数,把字符串重新转换成整数,并返回。
c 复制代码
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;
}

总结

  1. 使用"mod10除10"的方法取出一个整数的每一位。
  2. 使用sprintf和sscanf把字符串和整数相互转换。
  3. 使用strchr函数查找字符串中的字符。

感谢大家的阅读!

相关推荐
Logic1015 小时前
C语言/数据结构字符串题解:按字符类型重排(数字→字母→符号)——三趟扫描稳定分区
c语言·数据结构·字符串·时间复杂度·计数排序·算法题·ascii
阿俊-全栈开发9 小时前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户
Logic10111 小时前
C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
wuminyu12 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
小蒋学算法12 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
m0_3807438712 小时前
C++中的freopen的用法实例详解
开发语言·c++
荆棘鸟智能12 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
Escalating_xu12 小时前
【Python】基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
jimy113 小时前
polymorph.cpp里面的“析构函数、智能指针”问题
开发语言·c++
m0_3807438713 小时前
PHP 8.3 缓存清除不生效怎么排查
开发语言·php