Java函數&算法每天練—— Math函數總結&&字符串轉換整數 (atoi)

肥學大師 2021-08-15 13:40:43 阅读数:325

本文一共[544]字,预计阅读时长:1分钟~
java 算法 每天 math 字符串

小白練手專欄,適合剛入手的新人歡迎訂閱編程小白進階
python有趣練手項目,可以讓你快樂學python練手項目專欄

另外想學JavaWeb進廠的同學可以看看這個專欄:傳送們
這是個面試和考研的算法練習我們一起加油上岸之路

題目

請你來實現一個 myAtoi(string s) 函數,使其能將字符串轉換成一個 32 比特有符號整數(類似 C/C++ 中的 atoi
函數)。

函數 myAtoi(string s) 的算法如下:

讀入字符串並丟弃無用的前導空格 。
.
檢查下一個字符(假設還未到字符末尾)為正還是負號,讀取該字符(如果有)。 確定最終結果是負數還是正數。如果兩者都不存在,則假定結果為正。
.
讀入下一個字符,直到到達下一個非數字字符或到達輸入的結尾。字符串的其餘部分將被忽略。
.
將前面步驟讀入的這些數字轉換為整數(即,“123” -> 123, “0032” -> 32)。如果沒有讀入數字,則整數為 0。必要時更改符號(從步驟 2 開始)。
.
如果整數數超過 32 比特有符號整數範圍 [−231, 231 − 1]需要截斷這個整數,使其保持在這個範圍內。具體來說,小於 −231 的整數應該被固定為 −231 ,大於 231 − 1 的整數應該被固定為231 − 1 。
.
返回整數作為最終結果。

注意:
本題中的空白字符只包括空格字符 ' ' 。
除前導空格或數字後的其餘字符串外,請勿忽略 任何其他字符。
示例 1:
輸入:s = "42"
輸出:42
解釋:加粗的字符串為已經讀入的字符,插入符號是當前讀取的字符。
第 1 步:"42"(當前沒有讀入字符,因為沒有前導空格)
^2 步:"42"(當前沒有讀入字符,因為這裏不存在 '-' 或者 '+'^3 步:"42"(讀入 "42"^
解析得到整數 42 。
由於 "42" 在範圍 [-231, 231 - 1] 內,最終結果為 42
示例 2:
輸入:s = " -42"
輸出:-42
解釋:
第 1 步:" -42"(讀入前導空格,但忽視掉)
^2 步:" -42"(讀入 '-' 字符,所以結果應該是負數)
^3 步:" -42"(讀入 "42"^
解析得到整數 -42 。
由於 "-42" 在範圍 [-231, 231 - 1] 內,最終結果為 -42
示例 3:
輸入:s = "4193 with words"
輸出:4193
解釋:
第 1 步:"4193 with words"(當前沒有讀入字符,因為沒有前導空格)
^2 步:"4193 with words"(當前沒有讀入字符,因為這裏不存在 '-' 或者 '+'^3 步:"4193 with words"(讀入 "4193";由於下一個字符不是一個數字,所以讀入停止)
^
解析得到整數 4193 。
由於 "4193" 在範圍 [-231, 231 - 1] 內,最終結果為 4193
示例 4:
輸入:s = "words and 987"
輸出:0
解釋:
第 1 步:"words and 987"(當前沒有讀入字符,因為沒有前導空格)
^2 步:"words and 987"(當前沒有讀入字符,因為這裏不存在 '-' 或者 '+'^3 步:"words and 987"(由於當前字符 'w' 不是一個數字,所以讀入停止)
^
解析得到整數 0 ,因為沒有讀入任何數字。
由於 0 在範圍 [-231, 231 - 1] 內,最終結果為 0
示例 5:
輸入:s = "-91283472332"
輸出:-2147483648
解釋:
第 1 步:"-91283472332"(當前沒有讀入字符,因為沒有前導空格)
^2 步:"-91283472332"(讀入 '-' 字符,所以結果應該是負數)
^3 步:"-91283472332"(讀入 "91283472332"^
解析得到整數 -91283472332 。
由於 -91283472332 小於範圍 [-231, 231 - 1] 的下界,最終結果被截斷為 -231 = -2147483648

提示:

0 <= s.length <= 200 s 由英文字母(大寫和小寫)、數字(0-9)、’ ‘、’+’、’-’ 和 ‘.’ 組成
通過次數323,466提交次數1,494,392

一點點思路

剛看到這個題(我的心裏,好家夥題目這麼常不想寫了肯定很難),不知道大家有沒有這樣想,哈哈哈。仔細看完如果你看了之前幾篇例題的話這道題簡直張飛吃豆芽——小菜一碟,所以大家知道了我們一塊刷題的重要性了吧。不信的話我們往下看,去驗證是不是都是以前做的方法。

開幹

常規介紹一種函數

之前介紹的StringBuilder()toCharArray()在這裏都有用到哦。今天給大家介紹的函數是Math函數他作為一種數學函數適用範圍還是挺廣的,我們看看他有那些功能吧。

Math.PI 記錄的圓周率
Math.E 記錄e的常量
Math中還有一些類似的常量,都是一些工程數學常用量。
Math.abs 求絕對值
Math.sin 正弦函數 Math.asin 反正弦函數
Math.cos 餘弦函數 Math.acos 反餘弦函數
Math.tan 正切函數 Math.atan 反正切函數 Math.atan2 商的反正切函數
Math.toDegrees 弧度轉化為角度 Math.toRadians 角度轉化為弧度
[color=red]Math.ceil 得到不小於某數的最大整數 比它大的數[/color]
[color=red]Math.floor 得到不大於某數的最大整數 比它小的數[/color]
Math.IEEEremainder 求餘
Math.max 求兩數中最大
Math.min 求兩數中最小
Math.sqrt 求開方
[color=red]Math.pow 求某數的任意次方, 拋出ArithmeticException處理溢出异常[/color]
Math.exp 求e的任意次方
Math.log10 以10為底的對數
Math.log 自然對數
Math.rint 求距離某數最近的整數(可能比某數大,也可能比它小)
[color=red]Math.round 求距離某數最近的整數,返回int型或者long型(上一個函數返回double型)[/color]
Math.random 返回01之間的一個隨機數

源碼及分析

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);
}
}

當然這是我自己的格式寫的,沒有按官方的格式。來吧我們開始逐一解釋:

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的功能我就不介紹了吧,够基礎的了
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();
}
else if(list[i]=='+'||list[i]=='-'||(Integer.valueOf(list[i])>=48&&Integer.valueOf(list[i])<=57)) {

lis.append(list[i]);

這個部分是判斷+-還有每個字符的ascll值准備的Integer.valueOf()就是計算ascll值的函數,只要在0-9之間的數都滿足。

  • 其實應該可以直接寫成這種形式
else if(list[i]=='+'||list[i]=='-'||(list[i]>='0'&&list[i]<='9')) {

lis.append(list[i]);

接著我們就剩下了主函數部分,這部分在提交的時候要變換的只不過我在寫講解的時候要用到就沒有按照官方的那種格式。

public static void main(String[] args) {

//這裏面涉及了三目運算不過我們之前就講過法則,這裏的主要功能是防止下面這種情况返回為一個空字符,我們就把它至為零
long a=Integer.parseInt(myAtoi("words and 987")==""? "0":myAtoi("words and 987"));
//就是上面說的Math函數的主要用法,因為答案要判斷範圍
//所以我們先讓我們求出來的數和上界(2^31)-1比找最小的
//再和-2^31比找最大的得出來的數就是我們要找的,不懂可以私信或者評論給詳解
int b= (int) Math.max(Math.min(a, Math.pow(2, 31)-1), Math.pow(-2, 31));
System.out.println(b);

好了今天的算法題就到這裏,你學會了嗎?總的來說這道題對我們前面幾道題進行了回憶,如果你沒想起來建議去看看。學過的不能忘了。

版权声明:本文为[肥學大師]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815134035047o.html