版权声明:本文为博主原创文章,未经博主允许不得转载。
一、问题描述
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 }