LeetCode刷题(1)~整数反转

举报
海轰Pro 发表于 2021/08/05 23:36:56 2021/08/05
【摘要】 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2 31, 2 31 − 1]。...

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2 31, 2 31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解答 By 海轰

提交代码

class Solution {
public: int reverse(int x) { int reslut=0; int b=0; while(x!=0) { b=x%10; x=x/10; if(reslut>INT_MAX/10||(reslut==INT_MAX&&b>7)) return 0; if(reslut<INT_MIN/10||(reslut==INT_MIN&&b<-8)) return 0; reslut=reslut*10+b; } return reslut; }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行结果
在这里插入图片描述

思路
    根据题目描述,假设a=123,要求输出结果为321,也就是对原数中的各个数字进行逆序排列,所以需要取出原数中最后一个数字3,放在新数的第一位。那么怎么使得3是新数字的第一位呢?因为不知道一共有多少位!但是我们可以利用数的原理,321=3100+210+1*1,所以对3进行左移即可(其实就是乘以10)。

  1. 取出数的最后一位b,声明一个新变量a=0,a=a*10+b,原数字=原数字/10
  2. 只要原数字!=0 ,重复步骤1

注意:输入数类型为int,没有溢出,但是反转后的数字却是可以溢出的。所以在a=a*10+b之前,应该先判断此时a的大小。

  • 假设原数为正数,那么int类型最大值INT_MAX=2147483647,最小值INT_MIN=-2147483648。发生溢出的语句:a=a10+b,为了判断是否溢出,需要在执行这条语句之前对a进行判断,根据判断结果决定是否执行该条语句。若此时a>214748364(INT_MAX/10),那么无论b是何值,最后执行a=a10+b后,a必定溢出;若a=214748364,只有b>7时,最后a才会溢出。
  • 假设原数为负数,同理,若a<-214748364,则一定溢出;若a=-214748364,只要b<-8,则一定溢出

C++完整测试程序demo

#include<iostream>
using namespace std;
  int reverse(int x) { int reslut=0; int b=0; while(x!=0) { b=x%10; x=x/10; if(reslut>INT_MAX/10||(reslut==INT_MAX&&b>7)) return 0; if(reslut<INT_MIN/10||(reslut==INT_MIN&&b<-8)) return 0; reslut=reslut*10+b; } return reslut; }
int main(){
  cout<<"int类型 最大值:"<<INT_MAX<<endl;//查看int 最大值
  cout<<"int类型 最小值:"<<INT_MIN<<endl;//查看int 最小值
  // 测试
  cout<<reverse(123)<<endl;
  cout<<reverse(-123)<<endl;
  cout<<reverse(120)<<endl; return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在这里插入图片描述

优化

class Solution {
public: int reverse(int x) { long result=0; while(x!=0) { result=result*10+x%10; x/=10; } return (result>INT_MAX||result<INT_MIN)?0:result; }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

官方解答

https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/

其他解答

1.思路清晰,图文并茂,比较好理解
2.继续简化了代码(看出了题目的小bug,学习学习)

题目来源

力扣网:https://leetcode-cn.com/

文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。

原文链接:haihong.blog.csdn.net/article/details/107612609

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。