String to Integer (atoi)

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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容