8. String to Integer

题目描述(中等难度)

在这里插入图片描述
大意:将一个字符串转为整型

这道题,难度不大,整体的思路就是遍历字符串,然后依次取出一个字符就可以了。
下面我们分几种情况来讨论下:

  • 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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安替-AnTi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值