前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Leetcode的Integer-inversion

Leetcode的Integer-inversion

原创
作者头像
Anime_Bucket
发布2025-03-07 17:16:20
发布2025-03-07 17:16:20
2500
代码可运行
举报
文章被收录于专栏: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
复制
 #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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目:
    • 示例:
  • 解题思路:
  • 遇到的问题:
    • 问题一:缓冲区的问题
    • 问题二:溢出问题:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档