最近在网上看到一个帖子,一网友疯狂吐槽米哈游,说米哈游谈的是16薪,等到不想用你的时候就给你打低绩效,只给13薪,然后各种威胁让你主动离职,还不走辞退流程,不给赔偿,真是恶心。
其中一网友评论说:不只是米哈游,好多公司都这情况,都已经成普遍了。
还有网友说:很多公司都这套路,用年终奖拿捏你,要好你的base就行了,奖金有就是赚了,没有也不在意,你不在意这个他就拿捏不了你。
还有一位前米哈游的员工说:我还没拿过低于16的。
--------------下面是今天的算法题--------------
看完了网友对米哈游的吐槽,我们再来看一道米哈游的面试题,这是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;
}
C:
int myAtoi(char *str) {
if (strlen(str) == 0)
return 0;
int length = strlen(str);
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多道,在公众号中写算法题解700多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。