关于这次文章的写与发布,这次我主要放两段代码,一段是我自己写的代码,有点拙劣不堪😅,下一段是官方的代码我把它拿过来解析了一下,其实这中间我也学习到了不少
下面放的是写的代码,看到这题最初想到的一种解法,废话不多说,上代码!😎
public class SecondReverse {
public static void main(String[] args) {
int reverse = reverse(14236469);
System.out.println(reverse);
}
public static int reverse(int x){
long result=0;
//将取出的数转为字符串方便后面操作
String strnum=x+"";
//超过上限判断
if (x>Integer.MAX_VALUE||x<Integer.MIN_VALUE){
//超过就打印一个0
System.out.println(0);
}else {
//下面是反转操作
char[] chars = strnum.toCharArray();
strnum="";
//是负数时进行判断手动增加-号,再进行反转累加
if (x<0){
strnum+="-";
for (int i=chars.length-1;i>=0;i--){
if (i!=0){
strnum+=chars[i];
}
}
}else if (x>0){
//正数时就进行反转累加
for (int i=chars.length-1;i>=0;i--){
strnum+=chars[i];
}
}else {
return 0;
}
}
//这里注意!!!
//防止反转超界,先转成long
long l = Long.parseLong(strnum);
//再进行判断若超出则返回0,不然强转返回反转的数
if (l<Integer.MIN_VALUE||l>Integer.MAX_VALUE){
return 0;
}else {
return (int) l;
}
}
}
是不是感觉很水😂,不过当时一分钟之内就想到这个解题思路,当时还是没有其他方法前提下用这个解的,毕竟先解出来最重要的,优化这事后期再改进
该说不说上述的写法主要思想就是先转字符数组再转回去,当然在同等算法下对内存消耗和机器性能要求要较高,下面的就是一种优化策略。
public class IntReverse {
public static void main(String[] args) {
int reverse = reverse(1561561651);
System.out.println(reverse);
}
public static int reverse(int x){
//这是定义一个反转的结果
int result=0;
while (x!=0){ //定义当传入的数不等于0就可以就下面运算
int num=x%10; //去到传入整数最后一位
x/=10; //将整个数缩小10倍,因为上述已经将最后一位各位数取到
//下面就是超过上限或下限的判断
if (result > Integer.MAX_VALUE/10 || (result == Integer.MAX_VALUE / 10 && num > 7)) return 0;
if (result < Integer.MIN_VALUE/10 || (result == Integer.MIN_VALUE / 10 &&num < -8)) return 0;
//这个就是反转的奥义所在,由后到前反过来乘出来
result=result*10+num;
}
return result;
}
}
在官方代码上加了注释为了更加便于理解。看吧,大佬的写法就是厉害,非常简洁明了,思路也很清晰,最重要的是中间的小算法。这其实就跟当初学设计环形队列的对头与队尾在添加时的索引号的所采用的小算法有相同的设计理念。
其实这些设计很精巧,不可能说一下子就领悟透彻,都是一点一点慢慢的累积与尝试所呈现的。比如说你不知道整数取模拿出最后一位再前移这一思路,虽然说可以写出来但是会有点麻烦。