首页 > 其他分享 >[LeetCode]008-字符串转换整数(atoi)

[LeetCode]008-字符串转换整数(atoi)

时间:2022-12-19 20:45:53浏览次数:70  
标签:字符 42 4193 整数 231 atoi 读入 008 LeetCode

>>> 传送门

题目

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
  6. 返回整数作为最终结果。

注意

  • 本题中的空白字符只包括空格字符 ' '
  • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例

示例1

输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"42"(读入 "42")
           ^
解析得到整数 42 。
由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。

示例2

输入:s = "   -42"
输出:-42
解释:
第 1 步:"   -42"(读入前导空格,但忽视掉)
            ^
第 2 步:"   -42"(读入 '-' 字符,所以结果应该是负数)
             ^
第 3 步:"   -42"(读入 "42")
               ^
解析得到整数 -42 。
由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。

示例3

输入:s = "4193 with words"
输出:4193
解释:
第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止)
             ^
解析得到整数 4193 。
由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

提示

  • 0 <= s.length <= 200
  • s 由英文字母(大写和小写)、数字(0-9)、' '、'+''-''.' 组成

题解

class Solution {
public:
    int myAtoi(string s) {
        int k = 0;
        while (k < s.size() && s[k] == ' ') k ++ ;
        if (k == s.size()) return 0;

        bool is_negative = false;
        if (s[k] == '-') k ++, is_negative = true;
        else if (s[k] == '+') k ++ ;

        int res = 0;
        while (k < s.size() && '0' <= s[k] && s[k] <= '9') {
            int t = s[k] - '0';
            // -res * 10 - t < INT_MIN
            if (is_negative && -res < (INT_MIN + t) / 10) return INT_MIN;
            if (!is_negative && res > (INT_MAX - t) / 10) return INT_MAX;
            if (-res * 10 - t == INT_MIN) return INT_MIN;
            res = res * 10 + t;
            k ++ ;
        }
        if (is_negative) res *= -1;
        return res;
    }
};

标签:字符,42,4193,整数,231,atoi,读入,008,LeetCode
From: https://www.cnblogs.com/yuyork/p/16993012.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:动物收容所
    题目:动物收容所。有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物......
  • LeetCode 两数之和,三数之和,最接近的三数之和,四数之和(C++)
    1.两数之和问题描述给定一个整数数组​​nums​​​和一个目标值​​target​​,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入......
  • LeetCode 有关二叉树的算法题目(C++)
    0、NULL与nullptr的区别在C语言中,​​NULL​​​通常被定义为:​​#defineNULL((void*)0)​​​。因为在C语言中把空指针赋给​​int​​​和​​char​​​指针的时候,发......
  • [leetcode]第 2 天 链表(简单)
    06.从尾到头打印链表思路说到从尾到头,很容易想到可以用到栈的方式进行处理,那么问题就转化成了如何用辅助栈完成打印链表。可以从链表的头节点开始,依次将每个节点压入栈......
  • SQL server 2008 的日期时间类型
     SQLServer2008提供多种日期时间类型供我们选择。以下是各个时间类型的汇总:数据类型格式取值范围精度存储尺寸dateyyyy-mm-dd0001-1-19999-12-311天3字节timehh:......
  • [LeetCode] 1971. Find if Path Exists in Graph
    Thereisa bi-directional graphwith n vertices,whereeachvertexislabeledfrom 0 to n-1 (inclusive).Theedgesinthegrapharerepresentedasa......
  • [leetcode]第 1 天 栈与队列(简单)
    09用两个栈实现队列思路栈:先进后出要求:先进先出。在队尾加,从队首删假设有栈A栈B,添加时压入栈A,删除时将栈A元素出栈,压入栈B,实现倒序,进而实现从队首删classCQueue{......
  • 【算法训练营day22】LeetCode235. 二叉搜索树的最近公共祖先 LeetCode701. 二叉搜索树
    LeetCode235.二叉搜索树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先初次尝试利用二叉搜索树的性质,迭代法即可,判断目标节点的值是否在当前节点值的两侧或与当......
  • (转载)linux中atoi函数
    标准C库函数#include<stdlib.h>原型:intatoi(constchar*str);功能:将字符串str转换成一个整数并返回结果。参数str以数字开头,当函数从str中读到非......
  • [LeetCode]007-整数反转
    >>>传送门题目给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围 [−231, 231 −1],就返回0。假......