java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810
題目要求:
給出一個(gè)32位的有符號整數(shù),你需要將這個(gè)整數(shù)中每位上的數(shù)字進(jìn)行反轉(zhuǎn)。
示例 1:
輸入: 123輸出: 321
示例 2:
輸入: -123輸出: -321
示例 3:
輸入: 120輸出: 21
示例 4:
輸入:9646324351輸出: 0
注意:
假設(shè)我們的環(huán)境只能存儲得下 32 位的有符號整數(shù),則其數(shù)值范圍為 [2的31次方, 2的31次方 1]。
請根據(jù)這個(gè)假設(shè),如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0。
解決方案1:
最low的方法
思路:
轉(zhuǎn)換成字符串。獲取最后第一位和最后一位。用于判斷是否是負(fù)數(shù)和是否是0
然后在進(jìn)行判斷,根據(jù)情況不同進(jìn)行判斷處理。
如下代碼:
public int reverse(int x) {String strX = Integer.valueOf(x).toString(); char [] charArr = strX.toCharArray(); int length = charArr.length; String [] strArr = new String [length]; for(int i =0;i0;i--){ index++; String str = strArr[i]; newStrArr[index] = str; } }else if("0".equals(lastStr)){ newStrArr = new String [length-1]; for(int i= length-2; i >=0;i--){ String str = strArr[i]; newStrArr[index] = str; index++; } }else if("-".equals(fasterStr)){ newStrArr[0] = fasterStr; for(int i= length-1; i >0;i--){ index++; String str = strArr[i]; newStrArr[index] = str; } }else{ for(int i= length-1; i >=0;i--){ String str = strArr[i]; newStrArr[index] = str; index++; } } String str = ""; for(int i = 0;i
此方案運(yùn)行結(jié)果:
運(yùn)行9毫秒,消耗內(nèi)存35.4M
解決方案二:
從數(shù)學(xué)思維來處理的。
例如:1234 反過來就是4321
也就是個(gè)位和千百位互換、十位和百位互換。
這些明白了吧。也就是10的x方+Y%10.
其中x是位數(shù)。Y是數(shù)據(jù)。
看懂上面的,我們就能得到下面代碼:
public int reverse2(int x) {//用數(shù)學(xué)思維來看 int rpc = 0; while (x != 0) { int newrpc = rpc*10 + x%10; log.info("rpc*10:{},x%10:{},newrpc:{}",(rpc*10),x%10,newrpc); if ((newrpc - x%10)/10 != rpc){ return 0; } rpc = newrpc; x = x/10; } log.info("==:{}",rpc); return rpc;}
運(yùn)行后打印日志:
我們在來看看此方案執(zhí)行結(jié)果:
耗時(shí)3毫秒,內(nèi)存消耗:34.3M
再來看第三種解決方案:
思路:使用字符串的反轉(zhuǎn)方法。當(dāng)溢出的時(shí)候異常直接返回0
public int reverse3(int x) {try { if(x > 0) { StringBuilder str = new StringBuilder().append(x); return Integer.parseInt(str.reverse().toString()); }else { StringBuilder str = new StringBuilder().append(-x); return Integer.parseInt(str.reverse().toString())*(-1); } }catch (NumberFormatException e) { return 0; }}
此方案運(yùn)行結(jié)果:
方案4:
使用了math函數(shù)、位運(yùn)算及字符串反轉(zhuǎn)的
public int reverse4(int x){//區(qū)域 右端點(diǎn) double start = Math.pow(2, 31) - 1; //區(qū)域 左端點(diǎn) double end = -Math.pow(2, 31); if(xstart){ return 0; } //獲取原始數(shù)字符號 float df = Math.signum(x); Integer intDf = Math.round(df); // 取絕對值 int i = Math.abs(x); //使用sring的反轉(zhuǎn)方式 StringBuilder str = new StringBuilder().append(i).reverse(); x = Integer.parseInt(str.toString()); log.info("==>:{}",x*intDf); return x*intDf ;}
執(zhí)行結(jié)果:
方案五:
使用的是位移運(yùn)輸和math函數(shù)。
public int reverse5(int x) {int res = 0; int of = ((1 << 31) - 1) / 10; while (x != 0) { if (Math.abs(res) > ((1 << 31) - 1) / 10){ return 0; } res = res * 10 + x % 10; x /= 10; } return res;}
執(zhí)行結(jié)果:
我們將5種方案進(jìn)行對比:
發(fā)現(xiàn)第二種和第五種方案耗時(shí)最短。也就是使用數(shù)學(xué)思路和位移運(yùn)行最快。
經(jīng)過五中方案比較之后,我們是不是體會到:編程是一門藝術(shù)了。
本文出處:凱哥Java(kaigejava)
好了,今天小算法就到這里了。《每天一個(gè)小算法》希望直接可以堅(jiān)持下去。
總結(jié)
以上是生活随笔為你收集整理的java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BeanUtils.copyProper
- 下一篇: 在计算机网络中发送电子邮件遵循的协议是,