拿來吧你!⚡考研面試⚡算法天天練—— 字符串轉換整數 (atoi)

這是我參與8月更文挑戰的第8天,活動詳情查看:8月更文挑戰java

題目

請你來實現一個 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 。 . 返回整數做爲最終結果。markdown

注意:

本題中的空白字符只包括空格字符 ' ' 。
除前導空格或數字後的其他字符串外,請勿忽略 任何其餘字符。
 
複製代碼
示例 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複製代碼

提示:app

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

一點點思路

剛看到這個題(個人內心,好傢伙題目這麼常不想寫了確定很難),不知道你們有沒有這樣想,哈哈哈。仔細看完若是你看了以前幾篇例題的話這道題簡直張飛吃豆芽——小菜一碟,因此你們知道了咱們一塊刷題的重要性了吧。不信的話咱們往下看,去驗證是否是都是之前作的方法。函數

開幹

常規介紹以種函數

以前介紹的StringBuilder()toCharArray()在這裏都有用到哦。今天給你們介紹的函數是Math函數他做爲一種數學函數適用範圍仍是挺廣的,咱們看看他有那些功能吧。post

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

}
複製代碼

固然這是我本身的格式寫的,沒有按官方的格式。來吧咱們開始逐一解釋:ui

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之間的數都知足。url

  • 其實應該能夠直接寫成這種形式
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);
複製代碼

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

相關文章
相關標籤/搜索