LeetCode|8.字符串转整数

实现 atoi,将字符串转为整数。

在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。

当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。

若函数不能执行有效的转换,返回 0。

说明:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。如果数值超过可表示的范围,则返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。


package LeetCode;

public class A8字符串转整数 {
	public int myAtoi(String str) {
		Boolean notFirstChar = false; // 该字符不是第一次出现
		Boolean notFirstZero = false; // 是不是左零
		Boolean isNegtive = false; // 判断正负
		Boolean hasNum = false; // 是否有数字
		String numString = new String(); // 保存数字
		for (int i = 0; i < str.length(); i++) {
			if ((notFirstChar == false) && str.charAt(i) == ' ') { // 左做空格
				System.out.println("跳过空格");
			} else if ((notFirstChar == false) && str.charAt(i) == '+') { // 该正号是第一次出现
				notFirstChar = true;
				System.out.println("是正数");
			} else if ((notFirstChar == false) && str.charAt(i) == '-') { // 该负号是第一次出现
				notFirstChar = true;
				System.out.println("是负数");
				isNegtive = true;
			} else if ((str.charAt(i) == '0') && (notFirstZero == false)) { // 0是左零
				// System.out.println(str.charAt((i+1<str.length()-1)?(i+1):i));
				if (i < str.length() - 1) {
					if (isNumber(str.charAt(i + 1)) == false) {
						System.out.println("这个0后面没有数字了,返回0");
						return 0;
					}
				}

				System.out.println("跳过左零");

			} else if (isNumber(str.charAt(i))) { // 0不是左零
				hasNum = true;
				notFirstChar = true;
				notFirstZero = true;
				numString += str.charAt(i);
			} else {
				if (notFirstChar == false) {
					return 0;
				} else {
					break;
				}
			}
		}
		if (isNegtive) { // 负数加上‘-’
			numString = '-' + numString;
		}

		if (hasNum == false) {
			return 0;
		}
		if (numString.length() > 12) {
			if (numString.charAt(0) == '-') {
				return Integer.MIN_VALUE;
			} else {
				return Integer.MAX_VALUE;
			}
		}

		// System.out.println(numString);

		Long numLong = Long.parseLong(numString);
		if (numLong <= Integer.MAX_VALUE && numLong >= Integer.MIN_VALUE) {
			System.out.println("合法范围");
			return Integer.parseInt(numString);
		} else if (numLong >= Integer.MAX_VALUE) {
			return Integer.MAX_VALUE;
		} else {
			return Integer.MIN_VALUE;
		}
	}

	private boolean isNumber(char ch) {
		// TODO Auto-generated method stub
		if (ch >= '0' && ch <= '9') {
			return true;
		}
		return false;
	}

	public static void main(String[] agrs) {
		A8字符串转整数 a8字符串转整数 = new A8字符串转整数();
		// String str = "20000000000000000000";
		// String str = "+";
		// String str = "-91283472332";
		// String str = " 0000000000012345678";
		// String str = " +0 123";
		// String str =" -42";
		// String str ="0-1";
		// String str ="000000000000000000";
		String str = "90";
		System.out.println(a8字符串转整数.myAtoi(str));
	}
}

这道题就是不断提交不断发现用例不满足不断修改代码的过程 = =。

几个常见的不容易满足的用例我写在main函数里了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值