还有几个小时ACL2020就出结果了,祈祷!

题目链接

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

题目描述

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

  • 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
  • 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
  • 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0

说明:

  • 本题中的空白字符只包括空格字符 ' ' 。
  • 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 。如果数值超过这个范围,请返回 INT_MAX) 或 INT_MIN) 。

示例1

        输入:
"42"
输出:
42

示例2

        输入:
"   -42"
输出:
-42
解释:
第一个非空白字符为 '-', 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例3

        输入:
"4193 with words"
输出:
4193
解释:
转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例4

        输入:
"words and 987"
输出:
0
解释:
第一个非空字符是 'w', 但它不是数字或正、负号。
因此无法执行有效的转换。

示例5

        输入:
"-91283472332"
输出:
-2147483648
解释:
数字 "-91283472332" 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。

题解

官方题解用的有限状态自动机,理解起来也是比较轻松的,写起来也避免了一堆臃肿的 if-else 。但是我这里就不用自动机了,直接模拟就行了,写起来也很轻松好理解!

  • 首先用一个变量 idx 标记当前遍历到的位置,用 sign = 1, -1 表示整数的正负性。
  • 然后从 idx = 0 开始,将开头的空格全部去掉。
  • 然后判断当前的位置 idx 处的字符是不是 +, - 或者数字,并且 idx 要小于字符串长度。如果一个都没满足,那么说明是非法字符串,直接返回 0
  • 然后如果当前的位置 idx 处的字符是 - ,那么就令 sign = -1 。否则如果是 + ,就令 sign = 1 。然后遍历后一个字符。
  • 最后遍历一段连续的数字,把它转换成整数,注意转换的时候要乘上符号位 sign 。如果发现数字超过了 [INT_MIN, INT_MAX] 范围,就直接返回最大最小值就行了。
  • 否则的话最后就是合法整数,直接返回答案。

代码

c++

        class Solution {public:int myAtoi(string str) {int idx = 0, n = str.size();long res = 0, sign = 1;while (idx < n && str[idx] == ' ') idx++;if (idx >= n || (str[idx] != '+' && str[idx] != '-' && !isdigit(str[idx]))) return 0;if (str[idx] == '-') {sign = -1;idx++;} else if (str[idx] == '+') {idx++;}while (idx < n && isdigit(str[idx])) {res = res*10+sign*(str[idx++]-'0');if (res > INT_MAX) return INT_MAX;if (res < INT_MIN) return INT_MIN;}return res;}
};

python

        class Solution:def myAtoi(self, str: str) -> int:str = str.lstrip()n, idx = len(str), 0res, sign = 0, 1if idx >= n or (str[idx] != '+' and str[idx] != '-' and not str[idx].isdigit()): return 0if str[idx] == '-':sign = -1idx += 1elif str[idx] == '+':idx += 1for c in str[idx:]:if not c.isdigit(): breakres = res*10+sign*(int(c))if res > 2**31-1: return 2**31-1if res < -2**31: return -2**31return res

正则表达式(python)

        class Solution:def myAtoi(self, str: str) -> int:return max(min(int(*re.findall('^[\+\-]?\d+', str.lstrip())), 2**31-1), -2**31)

参考资料

[1]

LeetCode 字符串转换整数(atoi): https://leetcode-cn.com/problems/string-to-integer-atoi/

【每日算法Day 89】手动实现字符串转整数(atoi)函数,你会吗?相关推荐

  1. 【数据结构与算法】之深入解析“字符串转换整数 (atoi)”的求解思路和算法示例

    一.题目要求 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数). 函数 myAtoi(string s) ...

  2. leetcode初级算法6.字符串转整数(atoi)

    leetcode初级算法6.字符串转整数(atoi) 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法: public int myAtoi(String s) {//避免魔法值先设spaceS ...

  3. 8. 字符串转换整数 (atoi)(leetcode力扣算法 - java / rust)

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

  4. c++ 32位有符号的整数_【LeetCode】字符串分类字符串转换整数 (atoi)

    " 摘要:本文主要讲述LeetCode字符串分类字符串转换整数 (atoi)解法.主要内容如下: 题目 示例 解题 " 01 - 题目 请你来实现一个 atoi 函数,使其能将字符 ...

  5. C语言试题三十二之编写函数function,它的功能是:将一个字符串转换为一个整数(不得调用c语言提供的将字符串转换为整数的函数)。

    1. 题目 请编写函数function,它的功能是:将一个字符串转换为一个整数(不得调用c语言提供的将字符串转换为整数的函数). 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复 ...

  6. 力扣——字符串转换整数 (atoi)

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

  7. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  8. C++字符串转换整数 (atoi)

    字符串转换整数 (atoi) 一个小更新. 今天仔细的研究了一下int型越界的情况, 顺便把力扣的一道题做了. 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 ...

  9. 32位有符号整数_[LeetCode] 8. 字符串转换整数 (atoi)

    题目链接:https://leetcode-cn.com/problems/string-to-integer-atoi/ 题目描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先 ...

  10. LeetCode8. 字符串转换整数 (atoi)

    LeetCode8. 字符串转换整数 (atoi) 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们 ...

最新文章

  1. 警惕!油性混合皮肤护理的误区 - 健康程序员,至尚生活!
  2. jsp 修改的员工select怎么_SpringBoot+Mybatis+Jsp 员工管理系统
  3. python中的float和eval_python中eval和float_python中eval与json.loads对json的处理
  4. This Handler class should be static or leaks might occur(null) 解决办法 (转)
  5. CSS之引入方式和选择器
  6. mysql正则替换字符串_mysql中替换字符串(正则) 模糊
  7. #{}不自动改参数类型_如何在不刷新页面的情况下改变URL
  8. 万年历c语言设计报告,C语言实训题目设计报告 万年历
  9. 农夫过河+java,农夫过河问题(java版)
  10. 我的nginx+php是如何配置的?
  11. double+float
  12. 十一.激光惯导LIO-SLAM框架学习之LIO-SAM框架---框架介绍和运行演示
  13. slub分配流程-kmem_cache_alloc函数
  14. 百度AI图像处理—图像主体识别调用教程(基于Python3-附Demo)
  15. 易语言源码翻译c,易语言编写翻译小工具源码
  16. 用oracle 11g bbed copy替换同一个表数据块block为另一个数据块之系列八
  17. 【算法】动态规划之计算二项式系数(C++源码)
  18. Java之List系列--ArrayList保证线程安全的方法
  19. 系统之家 Win10_21H1 x64位 游戏专业版系统下载 2021.06
  20. 零信任网络ZTNA及SDP概念理解 身份认证 安当加密

热门文章

  1. 转载js实现打印功能
  2. 安装tif虚拟打印机
  3. django 模型增加字段后迁移失败
  4. Java super与this
  5. 谈一谈chrome浏览器使用
  6. ASP.NET MVC3中的路由系统 Routes
  7. 使用CSS或Javascript实现隔行换色效果
  8. CS20Chapter2
  9. vue-resource 和 axios的区别
  10. android Sharedpreferences数据存储使用方法