发布于2020-02-10 17:34 阅读(1143) 评论(0) 点赞(10) 收藏(3)
问题描述:
问题分析:
该算法题难度属于medium,需要注意的点有以下几个:
C语言实现的过程为:
① 清除字符串首的空格字符,直到遇到非空格字符为止
② 设立标志位记录字符串是否有“+”“-” 以及输出结果的正负
③ 寻找之后的连续数字并判断是否在界限范围内
具体实现代码为:
int myAtoi(char * str){
// 移除开头的空格
while(*str == ' ')
++str;
// 记录正负性
int flag = 1;
if (*str == '-') {
flag = -1;
++str;
}
else if (*str == '+')
++str;
int ret = 0;
// 因为只能使用 32 位 int,因此将 ret 乘 10 后再与 INT_MAX 比较可能会溢出
// 因此使用 ret 与 INT_MAX/10 比较
int div = INT_MAX / 10;
while (*str <= '9' && *str >= '0') {
int dig = *str - '0';
// 若 ret 比 div 小,则 ret * 10 + dig 也一定小于 INT_MAX,不会溢出
// 若 ret 与 div 相等,只有 dig 比 8 小时不会溢出
// 此处本来需要正负分开讨论,INT_MAX 个位是 7,INT_MIN 个位是 8
// -INT_MIN 在 int 中会溢出,当 dig == 8 时直接当作溢出处理
if (ret < div || (ret == div && dig < 8)) {
ret = ret * 10 + dig;
++str;
}
// 溢出,根据正负性返回值
else
return (flag == 1? INT_MAX: INT_MIN);
}
return flag * ret;
}
运行结果为:
python实现的思路与C一致,只是实现的代码有些许不同,具体代码为:
class Solution:
def myAtoi(self, str: str) -> int:
# 变量初始化
INT_MAX = 2147483647
INT_MIN = -2147483648
sign = ['-', '+']
num = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
flag = 1
# 清楚字符串首的空格字符
str_new = str.lstrip()
str_output = ''
# 如果新生成的字符串为空,返回0
if str_new == '':
return 0
# 如果第一个非空格字符不在 sign 或者 num 中,返回0
elif str_new[0] not in sign and str_new[0] not in num:
return 0
# 如果第一个非空格字符是正负号且字符串长度为1,返回0
elif str_new[0] in sign and len(str_new)==1:
return 0
# 如果第一个是正负号,第二个不是数字,返回0
elif str_new[0] in sign and str_new[1] not in num:
return 0
else:
# 遍历新生成的字符串,将连续的数字存储在str_output中
str_output += str_new[0]
for i in range(1,len(str_new)):
if str_new[i] in num and flag == i:
str_output += str_new[i]
flag += 1
else:
# 输出在界限内的值
return max(min(int(str_output),INT_MAX),INT_MIN)
# 输出在界限内的值
return max(min(int(str_output),INT_MAX),INT_MIN)
运行结果为:
正则表达式就是为解决这种问题而生的,是非常简洁和高效地,我们来看一下具体的实现代码:
class Solution:
def myAtoi(self, str: str) -> int:
INT_MAX = 2147483647
INT_MIN = -2147483648
str = str.lstrip() #清除左边多余的空格
num_re = re.compile(r'^[\+\-]?\d+') #设置正则规则
num = num_re.findall(str) #查找匹配的内容
num = int(*num) #由于返回的是个列表,解包并且转换成整数
return max(min(num,INT_MAX),INT_MIN) #返回值
运行结果为:
更简洁的代码可以写成:
class Solution:
def myAtoi(self, s: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
运行结果为:
心得:虽然python写起来比较简单,但是在runtime上还是和C差很多
作者:爸爸去挣钱我去幼儿园
链接:https://www.pythonheidong.com/blog/article/231024/28c6039e471db6015dd6/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!