题目描述(中等难度)
大意:将一个字符串转为整型。
这道题,难度不大,整体的思路就是遍历字符串,然后依次取出一个字符就可以了。
下面我们分几种情况来讨论下:
- 1.如果字符串本身全部是数字,我们把sign=1作为判断数字符号的依据,如果是正数sign不变,如果是负数,那么sign=-1,最后的结果乘以这个符号即可。
- 2.如果字符串包含其他符号和数字。假设前面出现的是类似‘+’,‘-’,‘ ’这样的其他符号,那么直接将结果记为0;如果先出现数字,再出现其他符号,我们就只考虑前面的数字,这样就和第一种情况相同。
- 3.溢出的问题。因为整数范围是-2^31到+2 ^31.如果字符串中的数字超过了2 ^31,那么输出的最大结果就是2 ^31,如果字符串中的数字小于-2 ^31,那么输出的数字就是-2 ^31.
//将字符串转换为整数
public class String_to_Integer {
public static int myAtoi(String str) {
boolean hasSign=false;
int sign=1;
int ans=0;
for(int i=0;i<str.length();i++) {
if(str.charAt(i)=='-' && !hasSign) {
sign=-1;
hasSign=true;
continue;
}
if(str.charAt(i)=='+' && !hasSign) {
sign=1;
hasSign=true;
continue;
}
if(str.charAt(i)==' ' && !hasSign) {
continue;
}
if(str.charAt(i)>='0' && str.charAt(i)<='9') {
hasSign=true;
int pop=str.charAt(i)-'0';
if (ans * sign > Integer.MAX_VALUE / 10 || (ans * sign == Integer.MAX_VALUE / 10 && pop * sign > 7))
return 2147483647;
if (ans * sign < Integer.MIN_VALUE / 10 || (ans * sign == Integer.MIN_VALUE / 10 && pop * sign < -8))
return -2147483648;
ans=ans*10+pop;
}else {
return ans*sign;
}
}
return ans*sign;
}
public static void main(String args[]) {
String str="-wa42";
int answer=myAtoi(str);
System.out.println(answer);
}
}
看下执行效率
可以直接把上面的JAVA语言转换为Python。
class Solution(object):
def myAtoi(self, s):
sign=1
ans=0
hassign=False
for i in range(len(s)):
if(s[i]=='-' and hassign==False):
sign=-1
hassign=True
continue
if(s[i]=='+' and hassign==False):
sigh=1
hassign=True
continue
if(s[i]==' ' and hassign==False):
continue
if(s[i]>='0' and s[i]<='9'):
hassign=True
pop=int(s[i])
if(ans * sign > 2147483647/10 or (ans * sign == 2147483647 / 10 and pop * sign > 7)):
return 2147483647;
if(ans * sign <-2147483648/10 or (ans * sign == -2147483648 / 10 and pop * sign < -8)):
return -2147483648;
ans=ans*10+pop
else:
return ans*sign
return ans*sign
时间复杂度:O(n),n 是字符串的长度。
空间复杂度:O(1)。