題目:
請你來實現乙個 atoi 函式,使其能將字串轉換成整數。
首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第乙個非空格的字元為止。
當我們尋找到的第乙個非空字元為正或者負號時,則將該符號與之後面盡可能多的連續數字組合起來,作為該整數的正負號;假如第乙個非空字元是數字,則直接將其與之後連續的數字字元組合起來,形成整數。
該字串除了有效的整數部分之後也可能會存在多餘的字元,這些字元可以被忽略,它們對於函式不應該造成影響。
注意:假如該字串中的第乙個非空格字元不是乙個有效整數字元、字串為空或字串僅包含空白字元時,則你的函式不需要進行轉換。
在任何情況下,若函式不能進行有效的轉換時,請返回 0。
說明:假設我們的環境只能儲存 32 位大小的有符號整數,那麼其數值範圍為 [−231, 231 − 1]。如果數值超過這個範圍,請返回 int_max (231 − 1) 或 int_min (−231) 。
用了兩種解法:
解法一:看起來就比較複雜,沒有認真思考仔細審題就是這個結果,費時費力。
intmyatoi
(char
* str)
elseif(
*str ==
'+')
else
}elseif(
*str ==
'-')
else
}elseif(
*str >=
'0'&&
*str <=
'9')
else
if(num > int_max/
10||
(num == int_max/
10&& str_value >=7)
)/*計算值的時候要對正負進行判斷,並且要注意num是否為0值*/
if(plus_minus ==0)
else
str++
; time++;}
else
}return num;
}解法二:模組劃分得比較清楚,易讀性高。
仔細解讀題目就可以知道,在有效字元之前(『0』~『9』)只允許空格和『+』『-』號出現,且正負符號只能出現在有效數字的前面,也就是說只允許出現「空格」+「正負符號」+「有效字元」的組合,其餘不符合條件的情況,返回0.
intmyatoi
(char
* str)if(
*str ==
'-')
elseif(
*str ==
'+')
while
(*str !=
'\0'
)else
}return plus_minus ? num:
-num;
}
值得注意的地方:
0x7fffffff 表示正數:2147483647;學過計算機基礎的都知道,計算機中:0x80000000 表示負數:-2147483648;
正數:原碼 = 反碼 = 補碼;
負數:反碼 = 原碼取反;補碼=反碼+1;
按照這樣的規律理解0x80000000對應十進位制的-0,但是列印出來確是-2147483648;
原因是在十六進製制中負數的二進位制原碼的最高位是符號位,後面的31位為序號位,不是值。序號位算出來的值表示負數中從最小值開始到0的位置數。比如:
int型別的取值範圍為[-2 ^31 ~ 2 ^31]
0x800000000
原碼 1000 0000 0000 0000 0000 0000 0000 0000
最高位為1,為負數,序號位的值為0;表示負數範圍內從左到右第一位,即-2 ^31。
再來看看0xffffffff
原碼 1111 1111 1111 1111 1111 1111 1111 1111
最高位為1 ,為負數,序號位為第(2 ^ 31)-1位 (111 1111 1111 1111 1111 1111 1111 1111=(2 ^ 31-1) 所以0xffffffff為負數從小到大 第2^31-1位 ,
即-2 ^ 31+2 ^ 31 - 1= -1
力扣刷題系列
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。從中學知識知道,如果需要求一組數字的中位數,那麼先要從小到大排列這些數字。接著,如果總共有奇數個...
刷題 力扣 119
題目鏈結 題目描述 給定乙個非負索引 k,其中 k 33,返回楊輝三角的第 k 行。在楊輝三角中,每個數是它左上方和右上方的數的和。示例 輸入 3 輸出 1,3,3,1 高階 題目分析 根據題目描述楊輝三角形每一行從左到右依次是 組合 combiner是用來計算組合的結果 依次遍歷每一行從左到右 c...
刷題 力扣 665
題目鏈結 題目描述 給你乙個長度為 n 的整數陣列,請你判斷在 最多 改變 1 個元素的情況下,該陣列能否變成乙個非遞減數列。我們是這樣定義乙個非遞減數列的 對於陣列中所有的 i 0 i n 2 總滿足 nums i nums i 1 示例 1 輸入 nums 4,2,3 輸出 true 解釋 你可...