{
  "type": "code_options",
  "author": "csdn.net",
  "source": "solution.md",
  "exercise_id": "82e92bc6457a45cd8a6890a7dcae7483",
  "keywords": "字符串",
  "title": "字符串转换整数 (atoi)",
  "desc": [
    {
      "content": "\n<div class=\"notranslate\">\n<p>请你来实现一个&nbsp;<code>myAtoi(string s)</code>&nbsp;函数，使其能将字符串转换成一个 32 位有符号整数（类似 C/C++ 中的 <code>atoi</code> 函数）。</p>",
      "language": "markdown"
    },
    {
      "content": "\n<p>函数&nbsp;<code>myAtoi(string s)</code> 的算法如下：</p>",
      "language": "markdown"
    },
    {
      "content": "\n<ul>\n<li>读入字符串并丢弃无用的前导空格</li>\n<li>检查下一个字符（假设还未到字符末尾）为正还是负号，读取该字符（如果有）。 确定最终结果是负数还是正数。 如果两者都不存在，则假定结果为正。</li>\n<li>读入下一个字符，直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。</li>\n<li>将前面步骤读入的这些数字转换为整数（即，\"123\" -&gt; 123， \"0032\" -&gt; 32）。如果没有读入数字，则整数为 <code>0</code> 。必要时更改符号（从步骤 2 开始）。</li>\n<li>如果整数数超过 32 位有符号整数范围 <code>[−2<sup>31</sup>,&nbsp; 2<sup>31&nbsp;</sup>− 1]</code>\n，需要截断这个整数，使其保持在这个范围内。具体来说，小于 <code>−2<sup>31</sup></code> 的整数应该被固定为 <code>−2<sup>31</sup></code> ，大于\n<code>2<sup>31&nbsp;</sup>− 1</code> 的整数应该被固定为 <code>2<sup>31&nbsp;</sup>− 1</code> 。\n</li>\n<li>返回整数作为最终结果。</li>\n</ul>",
      "language": "markdown"
    },
    {
      "content": "\n<p><strong>注意：</strong></p>",
      "language": "markdown"
    },
    {
      "content": "\n<ul>\n<li>本题中的空白字符只包括空格字符 <code>' '</code> 。</li>\n<li>除前导空格或数字后的其余字符串外，<strong>请勿忽略</strong> 任何其他字符。</li>\n</ul>",
      "language": "markdown"
    },
    {
      "content": "\n<p>&nbsp;</p>",
      "language": "markdown"
    },
    {
      "content": "\n<p><strong>示例&nbsp;1：</strong></p>",
      "language": "markdown"
    },
    {
      "content": "\n<pre><strong>输入：</strong>s = \"42\"\n<strong>输出：</strong>42\n<strong>解释：</strong>加粗的字符串为已经读入的字符，插入符号是当前读取的字符。\n第 1 步：\"42\"（当前没有读入字符，因为没有前导空格）\n^\n第 2 步：\"42\"（当前没有读入字符，因为这里不存在 '-' 或者 '+'）\n^\n第 3 步：\"<strong>42</strong>\"（读入 \"42\"）\n^\n解析得到整数 42 。\n由于 \"42\" 在范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 内，最终结果为 42 。</pre>",
      "language": "markdown"
    },
    {
      "content": "\n<p><strong>示例&nbsp;2：</strong></p>",
      "language": "markdown"
    },
    {
      "content": "\n<pre><strong>输入：</strong>s = \"   -42\"\n<strong>输出：</strong>-42\n<strong>解释：</strong>\n第 1 步：\"   -42\"（读入前导空格，但忽视掉）\n^\n第 2 步：\"   -42\"（读入 '-' 字符，所以结果应该是负数）\n^\n第 3 步：\"   -<strong>42</strong>\"（读入 \"42\"）\n^\n解析得到整数 -42 。\n由于 \"-42\" 在范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 内，最终结果为 -42 。\n</pre>",
      "language": "markdown"
    },
    {
      "content": "\n<p><strong>示例&nbsp;3：</strong></p>",
      "language": "markdown"
    },
    {
      "content": "\n<pre><strong>输入：</strong>s = \"4193 with words\"\n<strong>输出：</strong>4193\n<strong>解释：</strong>\n第 1 步：\"4193 with words\"（当前没有读入字符，因为没有前导空格）\n^\n第 2 步：\"4193 with words\"（当前没有读入字符，因为这里不存在 '-' 或者 '+'）\n^\n第 3 步：\"<strong>4193</strong> with words\"（读入 \"4193\"；由于下一个字符不是一个数字，所以读入停止）\n^\n解析得到整数 4193 。\n由于 \"4193\" 在范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 内，最终结果为 4193 。\n</pre>",
      "language": "markdown"
    },
    {
      "content": "\n<p><strong>示例&nbsp;4：</strong></p>",
      "language": "markdown"
    },
    {
      "content": "\n<pre><strong>输入：</strong>s = \"words and 987\"\n<strong>输出：</strong>0\n<strong>解释：</strong>\n第 1 步：\"words and 987\"（当前没有读入字符，因为没有前导空格）\n^\n第 2 步：\"words and 987\"（当前没有读入字符，因为这里不存在 '-' 或者 '+'）\n^\n第 3 步：\"words and 987\"（由于当前字符 'w' 不是一个数字，所以读入停止）\n^\n解析得到整数 0 ，因为没有读入任何数字。\n由于 0 在范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 内，最终结果为 0 。</pre>",
      "language": "markdown"
    },
    {
      "content": "\n<p><strong>示例&nbsp;5：</strong></p>",
      "language": "markdown"
    },
    {
      "content": "\n<pre><strong>输入：</strong>s = \"-91283472332\"\n<strong>输出：</strong>-2147483648\n<strong>解释：</strong>\n第 1 步：\"-91283472332\"（当前没有读入字符，因为没有前导空格）\n^\n第 2 步：\"-91283472332\"（读入 '-' 字符，所以结果应该是负数）\n^\n第 3 步：\"-<strong>91283472332</strong>\"（读入 \"91283472332\"）\n^\n解析得到整数 -91283472332 。\n由于 -91283472332 小于范围 [-2<sup>31</sup>, 2<sup>31</sup> - 1] 的下界，最终结果被截断为 -2<sup>31</sup> = -2147483648 。</pre>",
      "language": "markdown"
    },
    {
      "content": "\n<p>&nbsp;</p>",
      "language": "markdown"
    },
    {
      "content": "\n<p><strong>提示：</strong></p>",
      "language": "markdown"
    },
    {
      "content": "\n<ul>\n<li><code>0 &lt;= s.length &lt;= 200</code></li>\n<li><code>s</code> 由英文字母（大写和小写）、数字（<code>0-9</code>）、<code>' '</code>、<code>'+'</code>、<code>'-'</code> 和\n<code>'.'</code> 组成\n</li>\n</ul>\n</div>",
      "language": "markdown"
    }
  ],
  "answer": [
    {
      "content": "",
      "language": "cpp"
    }
  ],
  "prepared": [
    [
      {
        "content": "",
        "language": "cpp"
      }
    ],
    [
      {
        "content": "",
        "language": "cpp"
      }
    ],
    [
      {
        "content": "",
        "language": "cpp"
      }
    ]
  ],
  "template": {
    "content": "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}",
    "language": "cpp"
  },
  "node_id": "dailycode-cf3b107ef2f143bf9071cd2d97d83a02",
  "license": "csdn.net",
  "created_at": 1637894158,
  "topic_link": "https://bbs.csdn.net/topics/600470794"
}