https://leetcode.com/problems/string-to-integer-atoi/
这道题的核心是string2int,但是leetcode强加了很多自己的限制
- 删除空格开头的无效字符(只有空格开头),非空格字符开头默认为无法转化( 123可转,而asdf123不可转)
- 只转连续int数字,小数点和非数字字符默认打断转化(3223wer123转为3223,333.232转为333)
- 考虑正负符号,只能出现一次,且必须出现在数字头部
- 32位int的边界问题 -2^32 到2^32-1
class Solution {
/**
* @param String $str
* @return Integer
*/
function myAtoi($str) {
$arrStr = str_split(trim($str));
$res = "";
$flag = 1;
//不是以数字开头,或者不是以正负号开头,则直接返回0
if (!ctype_digit($arrStr[0]) && $arrStr[0] != "+" && $arrStr[0] != "-") {
return 0;
}
foreach ($arrStr as $k => $st) {
//有了正负号后,下面一定跟着数字,否则不再继续往下遍历
if ($st == "+" || $st == "-") {
if (($k < count($arrStr) -1) && !ctype_digit($arrStr[$k + 1])) {
break;
}
//正负号一定在第一个
if($k != 0){
break;
}
if ($st == "-") {
$flag = -1;
}
continue;
}
if (!ctype_digit($st)) {
break;
}
$res .= $st;
}
//判断int是否越界,-2^32 到2^32-1
if (intval($res) >= pow(2, 31)) {
$res = $flag > 0 ? pow(2, 31) -1 : pow(2, 31);
}
return $flag * intval($res);
}
}
网友评论