{ "question_id": 8, "question_title": "字符串转换整数 (atoi)", "difficulty": "中等", "question_content": "<div class=\"notranslate\">\n\t<p>请你来实现一个 <code>myAtoi(string s)</code> 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 <code>atoi</code> 函数)。</p>\n\n\t<p>函数 <code>myAtoi(string s)</code> 的算法如下:</p>\n\n\t<ul>\n\t\t<li>读入字符串并丢弃无用的前导空格</li>\n\t\t<li>检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。</li>\n\t\t<li>读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。</li>\n\t\t<li>将前面步骤读入的这些数字转换为整数(即,\"123\" -> 123, \"0032\" -> 32)。如果没有读入数字,则整数为 <code>0</code> 。必要时更改符号(从步骤 2 开始)。</li>\n\t\t<li>如果整数数超过 32 位有符号整数范围 <code>[−2<sup>31</sup>, 2<sup>31 </sup>− 1]</code>\n\t\t\t,需要截断这个整数,使其保持在这个范围内。具体来说,小于 <code>−2<sup>31</sup></code> 的整数应该被固定为 <code>−2<sup>31</sup></code> ,大于\n\t\t\t<code>2<sup>31 </sup>− 1</code> 的整数应该被固定为 <code>2<sup>31 </sup>− 1</code> 。\n\t\t</li>\n\t\t<li>返回整数作为最终结果。</li>\n\t</ul>\n\n\t<p><strong>注意:</strong></p>\n\n\t<ul>\n\t\t<li>本题中的空白字符只包括空格字符 <code>' '</code> 。</li>\n\t\t<li>除前导空格或数字后的其余字符串外,<strong>请勿忽略</strong> 任何其他字符。</li>\n\t</ul>\n\n\t<p> </p>\n\n\t<p><strong>示例 1:</strong></p>\n\n\t<pre><strong>输入:</strong>s = \"42\"\n<strong>输出:</strong>42\n<strong>解释:</strong>加粗的字符串为已经读入的字符,插入符号是当前读取的字符。\n第 1 步:\"42\"(当前没有读入字符,因为没有前导空格)\n\t\t ^\n第 2 步:\"42\"(当前没有读入字符,因为这里不存在 '-' 或者 '+')\n\t\t ^\n第 3 步:\"<strong>42</strong>\"(读入 \"42\")\n\t\t ^\n解析得到整数 42 。\n由于 \"42\" 在范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 内,最终结果为 42 。</pre>\n\n\t<p><strong>示例 2:</strong></p>\n\n\t<pre><strong>输入:</strong>s = \" -42\"\n<strong>输出:</strong>-42\n<strong>解释:</strong>\n第 1 步:\" -42\"(读入前导空格,但忽视掉)\n\t\t\t^\n第 2 步:\" -42\"(读入 '-' 字符,所以结果应该是负数)\n\t\t\t ^\n第 3 步:\" -<strong>42</strong>\"(读入 \"42\")\n\t\t\t ^\n解析得到整数 -42 。\n由于 \"-42\" 在范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 内,最终结果为 -42 。\n</pre>\n\n\t<p><strong>示例 3:</strong></p>\n\n\t<pre><strong>输入:</strong>s = \"4193 with words\"\n<strong>输出:</strong>4193\n<strong>解释:</strong>\n第 1 步:\"4193 with words\"(当前没有读入字符,因为没有前导空格)\n\t\t ^\n第 2 步:\"4193 with words\"(当前没有读入字符,因为这里不存在 '-' 或者 '+')\n\t\t ^\n第 3 步:\"<strong>4193</strong> with words\"(读入 \"4193\";由于下一个字符不是一个数字,所以读入停止)\n\t\t ^\n解析得到整数 4193 。\n由于 \"4193\" 在范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 内,最终结果为 4193 。\n</pre>\n\n\t<p><strong>示例 4:</strong></p>\n\n\t<pre><strong>输入:</strong>s = \"words and 987\"\n<strong>输出:</strong>0\n<strong>解释:</strong>\n第 1 步:\"words and 987\"(当前没有读入字符,因为没有前导空格)\n\t\t ^\n第 2 步:\"words and 987\"(当前没有读入字符,因为这里不存在 '-' 或者 '+')\n\t\t ^\n第 3 步:\"words and 987\"(由于当前字符 'w' 不是一个数字,所以读入停止)\n\t\t ^\n解析得到整数 0 ,因为没有读入任何数字。\n由于 0 在范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 内,最终结果为 0 。</pre>\n\n\t<p><strong>示例 5:</strong></p>\n\n\t<pre><strong>输入:</strong>s = \"-91283472332\"\n<strong>输出:</strong>-2147483648\n<strong>解释:</strong>\n第 1 步:\"-91283472332\"(当前没有读入字符,因为没有前导空格)\n\t\t ^\n第 2 步:\"-91283472332\"(读入 '-' 字符,所以结果应该是负数)\n\t\t ^\n第 3 步:\"-<strong>91283472332</strong>\"(读入 \"91283472332\")\n\t\t ^\n解析得到整数 -91283472332 。\n由于 -91283472332 小于范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 的下界,最终结果被截断为 -2<sup>31</sup> = -2147483648 。</pre>\n\n\t<p> </p>\n\n\t<p><strong>提示:</strong></p>\n\n\t<ul>\n\t\t<li><code>0 <= s.length <= 200</code></li>\n\t\t<li><code>s</code> 由英文字母(大写和小写)、数字(<code>0-9</code>)、<code>' '</code>、<code>'+'</code>、<code>'-'</code> 和\n\t\t\t<code>'.'</code> 组成\n\t\t</li>\n\t</ul>\n</div>", "topic_link": "https://bbs.csdn.net/topics/600470794", "cpp": "int myAtoi(char *str)\n{\n\tint i = 0;\n\tint sign = 0;\n\twhile (str[i] && str[i] == ' ')\n\t\ti++;\n\tif (str[i] == NULL)\n\t\treturn 0;\n\tif (str[i] == '-')\n\t{\n\t\tsign = 1;\n\t\ti++;\n\t}\n\telse if (str[i] == '+')\n\t{\n\t\tsign = 0;\n\t\ti++;\n\t}\n\telse if (str[i] < '0')\n\t\treturn 0;\n\telse if (str[i] > '9')\n\t\treturn 0;\n\tlong long int r = 0;\n\twhile (str[i])\n\t{\n\t\tif (str[i] < '0')\n\t\t\tbreak;\n\t\telse if (str[i] > '9')\n\t\t\tbreak;\n\t\telse\n\t\t\tr = r * 10 + str[i++] - '0';\n\t\tif (r > INT_MAX)\n\t\t\tbreak;\n\t}\n\tr = sign ? -r : r;\n\tif (r < INT_MIN)\n\t\treturn INT_MIN;\n\tif (r > INT_MAX)\n\t\treturn INT_MAX;\n\treturn (int)r;\n}", "java": "class Solution {\n\tpublic int myAtoi(String s) {\n\t\tlong y = 0;\n\t\tint i = 0;\n\t\tboolean w = false;\n\t\tboolean sign = false;\n\t\tint offset = 0;\n\t\tchar[] ints = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };\n\t\twhile (i < s.length()) {\n\t\t\tchar c = s.charAt(i);\n\t\t\tboolean isSign = false;\n\t\t\tif (w == false && c != ' ') {\n\t\t\t\tw = true;\n\t\t\t\tif (c == '-') {\n\t\t\t\t\tsign = true;\n\t\t\t\t\tisSign = true;\n\t\t\t\t}\n\t\t\t\tif (c == '+') {\n\t\t\t\t\tisSign = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (w && (!isSign)) {\n\t\t\t\tint v = Arrays.binarySearch(ints, c);\n\t\t\t\tif (v < 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ty = y * 10 + v;\n\t\t\t\tif (y > 0x7FFFFFFF) {\n\t\t\t\t\ty = 0x7FFFFFFF;\n\t\t\t\t\toffset = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t\treturn sign ? -(int) (y + offset) : (int) y;\n\t}\n}", "js": "/**\n * @param {string} str\n * @return {number}\n */\nvar myAtoi = function(str) {\n let y=0;\n let i=0;\n let w=false;\n let sign=false;\n const ints=['0','1','2','3','4','5','6','7','8','9'];\n while(i<str.length){\n let c = str[i];\n let isSign=false;\n if(w===false&&c!==' '){\n w=true;\n if(c==='-'){\n sign=true;\n isSign=true;\n }\n if(c==='+'){\n isSign = true;\n }\n }\n \n if(w&&(!isSign)){\n const v = ints.indexOf(c);\n if(v<0){\n break;\n }\n y=y*10+v;\n }\n i++;\n }\n \n let offset=0;\n if(y>0x7FFFFFFF){\n \ty = 0x7FFFFFFF;\n offset = 1;\n }\n return sign ? -(y+offset) : y;\n};\n\nfunction main(){\n\n}\n\nmain();\n", "python": "class Solution:\n\tdef myAtoi(self, s: str) -> int:\n\t\ty = 0\n\t\ti = 0\n\t\tw = False\n\t\tsign = False\n\t\tints = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\n\t\twhile i < len(s):\n\t\t\tc = s[i]\n\t\t\tisSign = False\n\t\t\tif w == False and c != ' ':\n\t\t\t\tw = True\n\t\t\t\tif c == '-':\n\t\t\t\t\tsign = True\n\t\t\t\t\tisSign = True\n\t\t\t\tif c == '+':\n\t\t\t\t\tisSign = True\n\t\t\tif w and not isSign:\n\t\t\t\ttry:\n\t\t\t\t\tv = ints.index(c)\n\t\t\t\t\ty = y*10+v\n\t\t\t\texcept:\n\t\t\t\t\tbreak\n\t\t\ti += 1\n\t\toffset = 0\n\t\tif y > 2147483647:\n\t\t\ty = 2147483647\n\t\t\toffset = 1\n\t\treturn -(y+offset) if sign else y\n# %%\ns = Solution()\nprint(s.myAtoi(s = \"42\"))", "status": 1, "keywords": "字符串", "license": { "cpp": "csdn.net", "python": "csdn.net", "java": "csdn.net" }, "notebook": { "cpp": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/7/7_cpp.ipynb?type=file", "python": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/7/7_python.ipynb?type=file", "java": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/7/7_java.ipynb?type=file" }, "notebook_enable": 1 }