Reverse Integer--Easy

本文探讨了如何处理一个32位有符号整数的反转问题,提供了两种解题思路:使用栈存储整数每位数字并通过StringBuffer整合,以及通过数学方式计算反转数。文章详细分析了溢出处理,确保反转后的数字仍在整数范围内。

版权声明:本文为博主原创文章,未经博主允许不得转载。

一、问题描述

  Given a 32-bit signed integer, reverse digits of an integer.

  意思是给你一个32位有符号的整数,求这个整数的反转数字。

二、生词

  signed adj /saɪnd/ 有符号的

  overflow vi /əʊvə'fləʊ/ 溢出

三、样例及说明

  

  注意要处理当反转数超出整数范围的情况!

四、解题思路及代码

  用栈存储整数中的每个数字,然后一次取出并用StringBuffer整合。

 1 class Solution {
 2     public int reverse(int x) {
 3         if(x==0) return 0;//若x为0,直接返回0
 4         String s = x+"";
 5         Stack<String> stack = new Stack<String>();
 6         StringBuffer sb = new StringBuffer();
 7         boolean flag=true;//正数
 8     
 9         for(int i=0; i<s.length(); i++) {
10             //如果最后一个数字是0,则不压入栈中
11             if(i==s.length()-1&&s.charAt(s.length()-1)=='0') continue;
12             if(i==0&&s.charAt(0)=='-') { //如果第一个字符是‘-’,把flag置为false,表示是一个负数
13                 flag=false;
14                 continue;
15             }
16             stack.push(s.charAt(i)+"");//压栈
17         }
18         while(!stack.empty()) { //栈不为空,出栈
19             sb.append(stack.pop());
20         }
21         s = sb.toString();//StringBuffer转String
22         //若反转数超出了整数的范围,则直接返回0
23         if(Long.parseLong(s)>Integer.MAX_VALUE) return 0;
24         int result = Integer.parseInt(s);
25         if(!flag){//判断符号正负
26             return -result;
27         }
28         return result;
29     }
30 }

   除了用栈这种数据结构来模拟反转数,也可以用数学的方式求解。假设x为传入的数,pop操作可以是:

pop = x % 10;
x = x/10;

  push操作可以是:

temp = rev * 10 +pop ;
rev = temp;

  现在分析溢出条件,因为 temp = rev * 10 +pop ,所以如果溢出,rev >= Integer.MAX_VALUE/10。当 rev > Integer.MAX_VALUE/10 时,肯定溢出,所以不作讨论。当rev == Integer.MAX_VALUE/10 时,为了不溢出,pop必须 <= 7才行。(Integer.MAX_VALUE = 2147483647)。负数的分析逻辑与整数类似。

 1 class Solution {
 2     public int reverse(int x) {
 3         int rev = 0;
 4         while (x != 0) {
 5             int pop = x % 10;
 6             x /= 10;
 7             if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
 8             if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
 9             rev = rev * 10 + pop;
10         }
11         return rev;
12     }
13 }

 

转载于:https://www.cnblogs.com/crush-u-1214/p/10447874.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值