Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Leetcode的Integer-inversion

Leetcode的Integer-inversion

原创
作者头像
Anime_Bucket
发布于 2025-03-07 09:16:20
发布于 2025-03-07 09:16:20
7700
代码可运行
举报
文章被收录于专栏:LeetCode刷题-WPLeetCode刷题-WP
运行总次数:0
代码可运行

题目:

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例:

示例 1:

输入:x = 123 输出:321

示例 2:

输入:x = -123 输出:-321

示例 3:

输入:x = 120 输出:21

示例 4:

输入:x = 0 输出:0

解题思路:

我们首先来看到最终的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 ​
 int reverse(int x) {
     char num[20] = {0};
     sprintf(num, "%d", x); // 将整数转换为字符串
 ​
     int length = strlen(num); // 获取字符串长度// 不是去掉末尾的0
     while (length > 0 && num[length - 1] == '0') {
         num[length - 1] = '\0';
         length--;
     }//如果有-号位置保持在num[0]不变
     for(int i = 0; i < length; i++)
     {
         if(num[i] == '-')
         {
             continue;
         }
         else
         {
             char temp = num[i];
             num[i] = num[length - 1];
             num[length - 1] = temp;
             length--;
         }
     }
 ​
     char *endptr;
     long long result = strtoll(num, &endptr, 10);if (result > 2147483647 || result < -2147483648)
     {
         return 0;
     }
     else {
         return (int)result;
     }
 }
 ​
 int main() {
     int x;printf("please input \n"); // 确保有换行符
     fflush(stdout);
     scanf("%d", &x);
     printf("%d \n", reverse(x)); // 确保有换行符return 0;
 }

代码看着确实还是非常的冗长。

因为代码中需要用到遍历,所以我们得先要算出我们输入的x的length,这个我们之前就已经学习过了,先格式化为字符串,然后使用strlen函数去获取字符串的长度。

我们看到示例中的几个例子,其中有包含了这些元素,负号,0。根据示例我们可以去对每个部分做算法。

关于末尾0的问题,我想到的就是直接让末尾的0为空,然后继续做反转字符串。如果遇到开头是负号的整数的话,我们就直接将负号continue掉。然后继续做反转字符串。然后为了防止他溢出,我们需要在做处理整数溢出的方式。

遇到的问题:

问题一:缓冲区的问题

问题样式:

image-20250306163902340
image-20250306163902340

在main函数部分我们可以看到我添加了一个fflush(stdout),这是因为我在最开始调试代码的时候发现我的程序时先输入的x,然后才会给我显示我们的提示语,即使我加了\n也不行。然后我就在想这是什么问题

首先我考虑的是缓冲区的问题

我们可以看到我们的printf("please input \n");的的确确有\n但是还是没有出发行缓冲,这就是因为我们printf过后,但当程序紧接着调用 scanf 时,输入操作可能导致输出缓冲区未被及时刷新。还有可能就是,终端可能在等待输入时,暂时挂起输出缓冲区的刷新,导致提示信息直到输入完成后才显示。

那我们可以根据我们代码运行的结果来判断到底是那种问题。

解决思路: 既然我们的缓冲区没有正常的被刷新的话,那我们直接让他执行完printf就刷新不就可以了吗。 那我们就可以使用fflush(stdou);来使得我们的程序强制刷新缓冲区。

问题二:溢出问题:

问题代码:

image-20250307134132380
image-20250307134132380

我们可以看到这里我们输入了一个很长的一段数字,但是他却并不是给我们返回0,这里其实就是已经溢出了。我们输入的是1534236469

这个范围确确实实还在int的范围内,但是我们这里去的是result的结果,取反之后的结果是9646324351但是这个值已经远远的大于了我们int的最大值,所以我们这里就溢出了,正常来说的话,我们应该让他去return 0;

解决思路: 因为int的最大范围已经远远的小于了取反之后的数,那我们就用一个更大范围的一个类型,我想到了long long ,我们通过改完类型之后,在调式一遍发现还是不行,然后我们再排查一遍问题,发现这一次的问题出现再strtol这个函数,因为strtol返回的是long int的值,我们需要换成strtoll,因为strtoll返回的是long long int的值。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 进阶之路 - 整数反转
思路就是先将整数取模,然后将整数/10,然后依次将数字从头排布,乘上10加上获取到的模,在此还要判断是否溢出的情况,因为要乘10,如果已经大于最大值的十分之一则为溢出,如果不大于最大值的十分之一,但取到的模大于7,也会导致溢出,最大值为 2147483648 ,负数的情况类似,以此达到反转的目的。
Li_XiaoJin
2022/06/10
1760
【Linux系统#5】基础 IO(文件描述符fd & 缓冲区 & 重定向)
✨ 黄粱一梦终须醒,镜花水月总是空 🌏
IsLand1314
2025/06/02
1550
【Linux系统#5】基础 IO(文件描述符fd & 缓冲区 & 重定向)
7 整数反转
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
木瓜煲鸡脚
2021/01/18
3460
7 整数反转
【Leetcode】string类刷题
接着,创建两个索引,begin和end,一个从前往后找,找到一个字母停止,另一个从后面找,找到字母停止,然后进行交换,保证begin<end,比较简单,代码如下:
用户11029103
2024/04/20
1200
【Leetcode】string类刷题
【C语言篇】从字符海洋到整数大陆——atoi 的探险之旅
在编程世界中,数据的存储和展示往往以字符串形式存在,例如从用户输入、文件读取或网络传输中获取的数据。为了对这些数据进行数值计算,我们需要一种可靠的方法将字符串转换为整数。这正是 atoi(ASCII to Integer)函数的用武之地。
熬夜学编程的小王
2024/11/25
2000
LeetCode - 整数反转
原题地址:https://leetcode-cn.com/problems/reverse-integer/
晓痴
2019/09/24
3340
LeetCode - 整数反转
007. 整数反转 | Leetcode题解
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231, 231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
苏南
2020/12/16
4120
007. 整数反转 | Leetcode题解
c++ LeetCode (初级字符串篇) 九道算法例题代码详解(二)
原文链接:https://www.cnblogs.com/DOMLX/p/11089327.html
徐飞机
2019/07/01
1.2K0
C/C++之string类小结
C++提供了三种方法可以将C++字符串转化为C字符串,分别是data(),c_str(),copy()成员函数来实现。
用户7886150
2021/02/15
4920
printf()详解之终极无惑
printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出。标准输出,即标准输出文件,对应终端的屏幕。printf()申明于头文件stdio.h。
恋喵大鲤鱼
2018/08/03
4.7K0
printf()详解之终极无惑
C++常用的函数
通常,在程序设计中,我们会发现一些程序段在程序的不同地方反复出现,此时可以将这些程序段作为相对独立的整体,用一个标识符给它起一个名字,凡是程序中出现该程序段的地方,只要简单地写上标识符即可。这样的程序段,我们称之为子程序(函数)。下面介绍一下C++提供的各种标准函数。
用户7886150
2021/02/11
1.6K0
江哥带你玩转C语言 | 05-printf 和 scanf 函数
printf函数 printf函数称之为格式输出函数,方法名称的最后一个字母f表示format。其功能是按照用户指定的格式,把指定的数据输出到屏幕上 printf函数的调用格式为: printf("格式控制字符串",输出项列表 ); 例如:printf("a = %d, b = %d",a, b); 非格式字符串原样输出, 格式控制字符串会被输出项列表中的数据替换 注意: 格式控制字符串和输出项在数量和类型上***必须一一对应*** ---- 格式控制字符串 形式: %[标志][输出宽度][.精
极客江南
2021/07/11
1.4K0
流动的代码:文件流畅读写的艺术(三)
scanf、fscanf 和 sscanf 是 C 语言中用于输入操作的函数,特别是用于格式化输入。它们属于标准输入/输出库,用于按照指定格式从不同来源读取数据。 以下是它们的基本详情和区别:
用户11029103
2024/03/19
2250
流动的代码:文件流畅读写的艺术(三)
【LeetCode】8. 字符串转换整数 (atoi)
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
韩旭051
2020/06/23
5510
【LeetCode】8. 字符串转换整数 (atoi)
LeetCode 刷题笔记——day 6
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
h-t-m
2022/11/24
3700
LeetCode 刷题笔记——day 6
[基础]《C Primer》笔记(上篇)
要把一个较小的常量作为long类型对待时,可以在值的末尾加上L后缀(小写的l不容易和数字1区分)。在支持long long的系统中,可以在值的末尾加上LL区分long long类型。
TOMOCAT
2020/06/09
2.2K0
[基础]《C Primer》笔记(上篇)
程序员进阶之算法练习(四十九)LeetCode
题目链接 题目大意: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
落影
2020/12/09
4830
DECIMAL 数据处理原理浅析
MySQL 中当使用 SELECT 查询常数时,例如:SELECT 123456789.123; 是如何处理的?
GreatSQL社区
2023/02/23
6230
函数strtol和strtok详解[通俗易懂]
long int strtol(const char *nptr, char **endptr, int base);
全栈程序员站长
2022/09/14
9990
C语言printf()/scanf()的转换说明和转换说明修饰符
printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出。标准输出,即标准输出文件,对应终端的屏幕。
CtrlX
2022/11/14
2.4K0
C语言printf()/scanf()的转换说明和转换说明修饰符
相关推荐
LeetCode 进阶之路 - 整数反转
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验