春季每日一题打卡day1—— 整数反转
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了春季每日一题打卡day1—— 整数反转相关的知识,希望对你有一定的参考价值。
整数反转
【题目描述】
解法一
【思路】
用字符处理整数,防止翻转之后范围超过32位整数的范围
由于是有符号整数,要分类讨论
- 正整数。a. 当翻转之后字符串长度小于max,则没有越界,正常返回。b.字符串长度相同,使用了字符串的比较方法 compareTo来界定是否有超过整数范围。
- 负数也同理
class Solution {
public int reverse(int x) {
//1. 字符串处理
String s = String.valueOf(x);
//2. 正负数判断
boolean sign = false;
String max = String.valueOf(Integer.MAX_VALUE);
String min = String.valueOf(Integer.MIN_VALUE).substring(1);
if( s.charAt(0) == '-') {
sign = true;
s = s.substring(1);
}//2147483647
StringBuffer sb = new StringBuffer(s);
String ns = sb.reverse().toString();
if(sign){
if(ns.length() < min.length() ) return Integer.parseInt( "-"+ns);//长度小于min 值肯定没有超过min范围
else if( ns.compareTo(min) <= 0) return Integer.parseInt( "-"+ns);//长度相等时才比较大小
else return 0;
}else{
if(ns.length() < max.length() ) return Integer.parseInt(ns);
else if(ns.compareTo(max) <= 0 ) return Integer.parseInt(ns);
else return 0;
}
}
}
解法二
- int类型res记录翻转之后的值,对x每次进行模10操作取个位,并将模10结果拼接到res末尾,然后x/=10。
- 在进行1操作 之前,需要判断是否超出了32位有符号整数范围。
a. x是正整数,如果 res *10 + x % 10 > Integer.MAX_VALUE ,即 res > (Integer.MAX_VALUE - x %10) /10,则返回0;
b. x是负整数,如果 res *10 + x % 10 < Integer.MIN_VALUE ,即 res < (Integer.MIN_VALUE - x %10) /10,则返回0;
class Solution {
public int reverse(int x) {
int res = 0;
while( x!= 0){
if( x > 0 && res > ( Integer.MAX_VALUE - x % 10) /10 ) return 0;
if( x < 0 && res < ( Integer.MIN_VALUE - x % 10) /10 ) return 0;
res = res *10 + x % 10;
x /= 10;
}
return res;
}
}
以上是关于春季每日一题打卡day1—— 整数反转的主要内容,如果未能解决你的问题,请参考以下文章
春季每日一题打卡day2 —— AcWing 435. 传球游戏