每天練一練Java函數(shù)與算法Math函數(shù)總結(jié)與字符串轉(zhuǎn)換整數(shù)
題目
請(qǐng)你來(lái)實(shí)現(xiàn)一個(gè) myAtoi(string s) 函數(shù),使其能將字符串轉(zhuǎn)換成一個(gè) 32 位有符號(hào)整數(shù)(類(lèi)似 C/C++ 中的 atoi
函數(shù))。
函數(shù) myAtoi(string s) 的算法如下:
讀入字符串并丟棄無(wú)用的前導(dǎo)空格 。
檢查下一個(gè)字符(假設(shè)還未到字符末尾)為正還是負(fù)號(hào),讀取該字符(如果有)。 確定最終結(jié)果是負(fù)數(shù)還是正數(shù)。如果兩者都不存在,則假定結(jié)果為正。
讀入下一個(gè)字符,直到到達(dá)下一個(gè)非數(shù)字字符或到達(dá)輸入的結(jié)尾。字符串的其余部分將被忽略。
將前面步驟讀入的這些數(shù)字轉(zhuǎn)換為整數(shù)(即,“123” -> 123, “0032” -> 32)。如果沒(méi)有讀入數(shù)字,則整數(shù)為 0。必要時(shí)更改符號(hào)(從步驟 2 開(kāi)始)。
如果整數(shù)數(shù)超過(guò) 32 位有符號(hào)整數(shù)范圍 [−231, 231 − 1]需要截?cái)噙@個(gè)整數(shù),使其保持在這個(gè)范圍內(nèi)。具體來(lái)說(shuō),小于 −231 的整數(shù)應(yīng)該被固定為 −231 ,大于 231 − 1 的整數(shù)應(yīng)該被固定為231 − 1 。
返回整數(shù)作為最終結(jié)果。
注意: 本題中的空白字符只包括空格字符 ' ' 。 除前導(dǎo)空格或數(shù)字后的其余字符串外,請(qǐng)勿忽略 任何其他字符。
示例 1: 輸入:s = "42" 輸出:42 解釋?zhuān)杭哟值淖址疄橐呀?jīng)讀入的字符,插入符號(hào)是當(dāng)前讀取的字符。 第 1 步:"42"(當(dāng)前沒(méi)有讀入字符,因?yàn)闆](méi)有前導(dǎo)空格) ^ 第 2 步:"42"(當(dāng)前沒(méi)有讀入字符,因?yàn)檫@里不存在 '-' 或者 '+') ^ 第 3 步:"42"(讀入 "42") ^ 解析得到整數(shù) 42 。 由于 "42" 在范圍 [-231, 231 - 1] 內(nèi),最終結(jié)果為 42 。
示例 2: 輸入:s = " -42" 輸出:-42 解釋?zhuān)? 第 1 步:" -42"(讀入前導(dǎo)空格,但忽視掉) ^ 第 2 步:" -42"(讀入 '-' 字符,所以結(jié)果應(yīng)該是負(fù)數(shù)) ^ 第 3 步:" -42"(讀入 "42") ^ 解析得到整數(shù) -42 。 由于 "-42" 在范圍 [-231, 231 - 1] 內(nèi),最終結(jié)果為 -42 。
示例 3: 輸入:s = "4193 with words" 輸出:4193 解釋?zhuān)? 第 1 步:"4193 with words"(當(dāng)前沒(méi)有讀入字符,因?yàn)闆](méi)有前導(dǎo)空格) ^ 第 2 步:"4193 with words"(當(dāng)前沒(méi)有讀入字符,因?yàn)檫@里不存在 '-' 或者 '+') ^ 第 3 步:"4193 with words"(讀入 "4193";由于下一個(gè)字符不是一個(gè)數(shù)字,所以讀入停止) ^ 解析得到整數(shù) 4193 。 由于 "4193" 在范圍 [-231, 231 - 1] 內(nèi),最終結(jié)果為 4193 。
示例 4: 輸入:s = "words and 987" 輸出:0 解釋?zhuān)? 第 1 步:"words and 987"(當(dāng)前沒(méi)有讀入字符,因?yàn)闆](méi)有前導(dǎo)空格) ^ 第 2 步:"words and 987"(當(dāng)前沒(méi)有讀入字符,因?yàn)檫@里不存在 '-' 或者 '+') ^ 第 3 步:"words and 987"(由于當(dāng)前字符 'w' 不是一個(gè)數(shù)字,所以讀入停止)
示例 5: 輸入:s = "-91283472332" 輸出:-2147483648 解釋?zhuān)? 第 1 步:"-91283472332"(當(dāng)前沒(méi)有讀入字符,因?yàn)闆](méi)有前導(dǎo)空格) ^ 第 2 步:"-91283472332"(讀入 '-' 字符,所以結(jié)果應(yīng)該是負(fù)數(shù)) ^ 第 3 步:"-91283472332"(讀入 "91283472332") ^ 解析得到整數(shù) -91283472332 。 由于 -91283472332 小于范圍 [-231, 231 - 1] 的下界,最終結(jié)果被截?cái)酁?-231 = -2147483648 。
提示:
0 <= s.length <= 200 s 由英文字母(大寫(xiě)和小寫(xiě))、數(shù)字(0-9)、' ‘、'+'、'-' 和 ‘.' 組成
通過(guò)次數(shù)323,466提交次數(shù)1,494,392一點(diǎn)點(diǎn)思路
剛看到這個(gè)題(我的心里,好家伙題目這么常不想寫(xiě)了肯定很難),不知道大家有沒(méi)有這樣想,哈哈哈。仔細(xì)看完如果你看了之前幾篇例題的話這道題簡(jiǎn)直張飛吃豆芽——小菜一碟,所以大家知道了我們一塊刷題的重要性了吧。不信的話我們往下看,去驗(yàn)證是不是都是以前做的方法。
開(kāi)干
常規(guī)介紹一種函數(shù)
之前介紹的StringBuilder()和toCharArray()在這里都有用到哦。今天給大家介紹的函數(shù)是Math函數(shù)他作為一種數(shù)學(xué)函數(shù)適用范圍還是挺廣的,我們看看他有那些功能吧。
Math.PI 記錄的圓周率 Math.E 記錄e的常量 Math中還有一些類(lèi)似的常量,都是一些工程數(shù)學(xué)常用量。 Math.abs 求絕對(duì)值 Math.sin 正弦函數(shù) Math.asin 反正弦函數(shù) Math.cos 余弦函數(shù) Math.acos 反余弦函數(shù) Math.tan 正切函數(shù) Math.atan 反正切函數(shù) Math.atan2 商的反正切函數(shù) Math.toDegrees 弧度轉(zhuǎn)化為角度 Math.toRadians 角度轉(zhuǎn)化為弧度 [color=red]Math.ceil 得到不小于某數(shù)的最大整數(shù) 比它大的數(shù)[/color] [color=red]Math.floor 得到不大于某數(shù)的最大整數(shù) 比它小的數(shù)[/color] Math.IEEEremainder 求余 Math.max 求兩數(shù)中最大 Math.min 求兩數(shù)中最小 Math.sqrt 求開(kāi)方 [color=red]Math.pow 求某數(shù)的任意次方, 拋出ArithmeticException處理溢出異常[/color] Math.exp 求e的任意次方 Math.log10 以10為底的對(duì)數(shù) Math.log 自然對(duì)數(shù) Math.rint 求距離某數(shù)最近的整數(shù)(可能比某數(shù)大,也可能比它?。? [color=red]Math.round 求距離某數(shù)最近的整數(shù),返回int型或者long型(上一個(gè)函數(shù)返回double型)[/color] Math.random 返回0,1之間的一個(gè)隨機(jī)數(shù)
源碼及分析
public class test { public static String myAtoi(String s) { char[] list=s.toCharArray(); StringBuilder lis=new StringBuilder(); for(int i=0;i<list.length;i++) { if(list[i]==' ') { continue; } else if(list[i]=='+'||list[i]=='-'||(Integer.valueOf(list[i])>=48&&Integer.valueOf(list[i])<=57)) { lis.append(list[i]); }else { return lis.toString(); } } return lis.toString(); } public static void main(String[] args) { long a=Integer.parseInt(myAtoi("words and 987")==""? "0":myAtoi("words and 987")); int b= (int) Math.max(Math.min(a, Math.pow(2, 31)-1), Math.pow(-2, 31)); System.out.println(b); } }
當(dāng)然這是我自己的格式寫(xiě)的,沒(méi)有按官方的格式。來(lái)吧我們開(kāi)始逐一解釋?zhuān)?/p>
public static String myAtoi(String s) { //下面兩行就是之前講的將字符串變?yōu)樽址麛?shù)組 char[] list=s.toCharArray(); StringBuilder lis=new StringBuilder(); //下面主要是以字符長(zhǎng)度為次數(shù)對(duì)字符進(jìn)行字符串轉(zhuǎn)換整數(shù) for(int i=0;i<list.length;i++) { //根據(jù)題目要求開(kāi)始碰到空格,丟棄無(wú)用的前導(dǎo)空格 if(list[i]==' ') { //continue的功能我就不介紹了吧,夠基礎(chǔ)的了 continue; }//下面這個(gè)判斷在下面詳細(xì)介紹 else if(list[i]=='+'||list[i]=='-'||(Integer.valueOf(list[i])>=48&&Integer.valueOf(list[i])<=57)) { lis.append(list[i]); }else {//碰到除上面條件以外的字符直接結(jié)束返回該字符串 return lis.toString(); } } return lis.toString(); } else if(list[i]=='+'||list[i]=='-'||(Integer.valueOf(list[i])>=48&&Integer.valueOf(list[i])<=57)) { lis.append(list[i]);
這個(gè)部分是判斷+和-還有每個(gè)字符的ascll值準(zhǔn)備的Integer.valueOf()就是計(jì)算ascll值的函數(shù),只要在0-9之間的數(shù)都滿足。
- 其實(shí)應(yīng)該可以直接寫(xiě)成這種形式
else if(list[i]=='+'||list[i]=='-'||(list[i]>='0'&&list[i]<='9')) { lis.append(list[i]);
接著我們就剩下了主函數(shù)部分,這部分在提交的時(shí)候要變換的只不過(guò)我在寫(xiě)講解的時(shí)候要用到就沒(méi)有按照官方的那種格式。
public static void main(String[] args) { //這里面涉及了三目運(yùn)算不過(guò)我們之前就講過(guò)法則,這里的主要功能是防止下面這種情況返回為一個(gè)空字符,我們就把它至為零 long a=Integer.parseInt(myAtoi("words and 987")==""? "0":myAtoi("words and 987")); //就是上面說(shuō)的Math函數(shù)的主要用法,因?yàn)榇鸢敢袛喾秶? //所以我們先讓我們求出來(lái)的數(shù)和上界(2^31)-1比找最小的 //再和-2^31比找最大的得出來(lái)的數(shù)就是我們要找的,不懂可以私信或者評(píng)論給詳解 int b= (int) Math.max(Math.min(a, Math.pow(2, 31)-1), Math.pow(-2, 31)); System.out.println(b);
好了今天的算法題就到這里,你學(xué)會(huì)了嗎?總的來(lái)說(shuō)這道題對(duì)我們前面幾道題進(jìn)行了回憶,如果你沒(méi)想起來(lái)建議去看看。學(xué)過(guò)的不能忘了。
到此這篇關(guān)于每天練一練Java函數(shù)與算法Math函數(shù)總結(jié)與字符串轉(zhuǎn)換整數(shù)的文章就介紹到這了,更多相關(guān)Java函數(shù)與算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring-redis-session 自定義 key 和過(guò)期時(shí)間
這篇文章主要介紹了spring-redis-session 自定義 key 和過(guò)期時(shí)間,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12基于String不可變字符與StringBuilder可變字符的效率問(wèn)題
這篇文章主要介紹了String不可變字符與StringBuilder可變字符的效率問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java實(shí)現(xiàn)讀取html文本內(nèi)容并按照格式導(dǎo)出到excel中
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)讀取html文本提取相應(yīng)內(nèi)容按照格式導(dǎo)出到excel中,文中的示例代碼講解詳細(xì),需要的可以參考下2024-02-02Java實(shí)現(xiàn)單鏈表反轉(zhuǎn)的多種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)單鏈表反轉(zhuǎn)的多種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Mybatis/Mybatis-Plus駝峰式命名映射的實(shí)現(xiàn)
本文主要介紹了Mybatis-Plus駝峰式命名映射的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07java開(kāi)發(fā)之Jdbc分頁(yè)源碼詳解
這篇文章主要介紹了java開(kāi)發(fā)之Jdb分頁(yè)源碼詳解,需要的朋友可以參考下2020-02-02java中實(shí)現(xiàn)控制臺(tái)打印sql語(yǔ)句方式
這篇文章主要介紹了java中實(shí)現(xiàn)控制臺(tái)打印sql語(yǔ)句方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06