专栏:50多种数据结构彻底征服

专栏:50多种经典图论算法全部掌握

据每日经济网报道英伟达员工有一半的人净资产已达到2500万美元,约合人民币1.83亿。不少英伟达员工反映为了支撑英伟达的高市值,他们经常每周工作 7 天,经常加班到凌晨 2 点。这工作量比起996严重多了,不过收入也确实很诱人。

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第8题:字符串转换整数 (atoi)

问题描述

来源:LeetCode第8题

难度:中等

把一个字符串s转化为整数,前面如果有空格要去掉,还要注意正负号,读入下一个字符,直到到达 下一个非数字字符或到达输入的结尾 ,字符串的其余部分将被忽略。

如果整数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31 − 1 的整数应该被固定为 2^31 − 1 。

示例1:

输入:s = " -42" 输出:-42 解释:" -42"(读入前导空格,但忽视掉)

示例2:

输入:s = "4193 with words" 输出:4193 解释:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止),解析得到整数 4193 。

  • 0 <= s.length <= 200

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

问题分析

这题是让把一个字符串转成一个整数,难度不是很大,但细节挺多,一不小心有可能就会做错。

首先如果字符串前面有空格要去掉,去掉最前面的空格之后如果遇到符号,还要记录符号,如果没有遇到符号就默认是正数。后面开始把字符串转成数字,如果遇到不是数字的直接停止,后面的忽略掉,就不要再转了。还有一点就是转成的数字不能超出int的范围,如果超出了直接截取。

我们需要使用一个变量sign来记录符号位, 1 表示正数, -1 表示负数,转的时候就不需要在考虑符号了,但最后返回的时候还要注意符号不能漏掉。

java:

public int myAtoi(String str) {     str = str.trim();// 去掉前后的空格     if (str.length() == 0)         return 0;     int num = 0;// 最终结果     int index = 0;// 遍历字符串中字符的位置     int sign = 1;// 符号,1是正数,-1是负数,默认为正数     int length = str.length();     // 判断符号     if (str.charAt(index) == '-' || str.charAt(index) == '+')         sign = str.charAt(index++) == '+' ? 1 : -1;     for (; index < length; ++index) {         // 取出字符串中字符,然后转化为数字         int digit = str.charAt(index) - '0';         // 按照题中的要求,读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。         // 字符串的其余部分将被忽略。如果读取了非数字,后面的都要忽略。         if (digit < 0 || digit > 9)             break;         // 越界处理         if (num > Integer.MAX_VALUE / 10 ||                 (num == Integer.MAX_VALUE / 10 && digit > Integer.MAX_VALUE % 10))             return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;         else             num = num * 10 + digit;     }     return sign * num; }

C++:

public:     int myAtoi(string str) {         if (str.empty())             return 0;         int length = str.size();         int index = 0;// 遍历字符串中字符的位置         while (str[index] == ' ')// 去掉前面的空格             if (++index == length)                 return 0;         int num = 0;// 最终结果         int sign = 1;// 符号,1是正数,-1是负数,默认为正数         // 判断符号         if (str[index] == '-' || str[index] == '+')             sign = str[index++] == '+' ? 1 : -1;         for (; index < length; ++index) {             // 取出字符串中字符,然后转化为数字             int digit = str[index] - '0';             // 按照题中的要求,读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。             // 字符串的其余部分将被忽略。如果读取了非数字,后面的都要忽略。             if (digit < 0 || digit > 9)                 break;             // 越界处理             if (num > INT_MAX / 10 ||                 (num == INT_MAX / 10 && digit > INT_MAX % 10))                 return sign == 1 ? INT_MAX : INT_MIN;             else                 num = num * 10 + digit;         }         return sign * num;     }

python:

def myAtoi(self, s: str) -> int:     s = s.strip()  # 删除首尾空格     if not s:         return 0  # 字符串为空则直接返回     num = 0  # 最终结果     index = 0  # 遍历字符串中字符的位置     sign = 1  # 符号,1是正数,-1是负数,默认为正数     int_max, int_min = 2 ** 31 - 1, -2 ** 31     if s[index] == '-' or s[index] == '+':         sign = 1 if s[index] == '+' else -1         index += 1     for c in s[index:]:         digit = ord(c) - ord('0')         if digit < 0 or digit > 9:             break  # 遇到非数字的字符则跳出             # 越界处理         if num > int_max // 10 or (num == int_max // 10 and digit > int_max % 10):             return int_max if sign == 1 else int_min         num = 10 * num + digit     return sign * num

笔者简介

博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。