阿亮的算法之路——7. 整数反转

阅读: 评论:0

阿亮的算法之路——7. 整数反转

阿亮的算法之路——7. 整数反转

题目描述

这题难度是简单,的确是这样。

首次尝试

思路

其实我一开始想到了移位,因为进行移位运算,效率更高,但是没不知道要怎么移位,或者说移位能不能实现,所以就用了最笨的办法,先实现功能。

要将一个数反转,计算出他的位数,然后再依次取出每一位,乘以相应的位权即可,最后求和。

例如:12,首先计算出它又两位,然后,取出2 乘以 10(2-1),再取出1乘以10(2-2),最后将其求和。

代码
		int y = x;int count = 0;while (y != 0){y = y/10;count ++;}long re = 0;for (int i = count-1;i >=0; i--){int temp = x%10;re += temp*Math.pow(10,i);x = x/10;}if (re > Integer.MAX_VALUE || re < Integer.MIN_VALUE)  { return 0; }return (int)re;

逻辑很简单,但是可能效率不是很理想,因为用了两次循环,我想一次搞定的,但是做不到,因为需要预先知道这个数的位数,才能在取出每个数字的时候,乘以相应的位权。

提交结果


果然不是很理想,我想到了另一个办法。

换个思路

上面那种做法,需要先统计出这个数字的位数,所以需要两次循环。那我能不能直接将这个数的每个位数直接交换呢?将这个数转换成一个字符数组不就好了嘛

代码
		boolean isMinus = false;if (x < 0){if (x == Integer.MIN_VALUE) return 0;x = -x;isMinus = true;}char[] chars = (x+"").toCharArray();int len = chars.length;for (int i = 0; i < len/2; i++){char temp = chars[len-1-i];chars[len-1-i] = chars[i];chars[i] = temp;}long re = Long.valueOf(new String(chars));if (isMinus)  re = - re;if (re > Integer.MAX_VALUE || re < Integer.MIN_VALUE) return 0;return (int)re;
提交结果

内存方面提高了不少,但是效率??效率为啥还降低了?现在遍历的次数,相当于是前一个思路的四分之一,按道理效率应该会提升诶,难道是转换成字符数组,会很耗时?

大佬思路

大佬果然是大佬,也是和我第一个方法那样的思路,但是处理得如此巧妙。我第一个方法,是先统计出有多少位,所以有了两次循环。大佬只用了一次循环,在取出每个数字的时候,就处理了。

代码
		int rev = 0;while (x != 0) {int pop = x % 10;x /= 10;if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;rev = rev * 10 + pop;}return rev;
提交结果

优秀啊!

本文发布于:2024-01-30 21:36:17,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170662178123001.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:之路   整数   算法
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23