【剑指offer】- 把字符串转换成整数 -46/67

1. 题目描述

在这里插入图片描述

2. 题目分析

  1. 对于字符串转为整数,比较简单,这里主要考察的是对于空指针、空字符串、非法输入、全部空格、是否溢出等一些特殊情况
  2. 首先,我们先考虑有空指针和空字符串情况,if (str.length() == 0) return 0;
  3. 空格情况,我们通过str.trim()去除空格,然后判断是否全为空格if (c.length == 0) { return 0; }
  4. 这时候,我们原本的字符串空格已经被我们处理掉了,我们需要判断字符串的正负性,便于我们之后的输出和遍历的开始下标。如果是负号的话,我们需要把标记位设置为-1,起始下标设置为1,如果是正号的话,我们需要把标记位设置为1,起始下标设置为1,如果什么都不是的话,我们需要把起始下标设置为0
  5. 处理非法输入:如果我们在遍历字符串的过程中,遇到if (c[i] < '0' || c[i] > '9') { break; }直接break,返回目前的sum即可。
  6. 溢出:因为我们的int的范围为Integer.MIN_VALUE ~ Integer.MAX_VALUE所以,我们在判断的时候,if (sum > dny || sum == dny && c[i] > '8') { return flag == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE; }此处的dny == Integer.MAX_VALUE/10
  7. 最后返回sum与标记位的乘积

3. 题目代码

 public int StrToInt(String str) {
        if (str.length() == 0) {
			return 0;
		}
		char[] c = str.trim().toCharArray(); // 去除空格
		if (c.length == 0) {
			return 0;
		}
		// 判断第一个符号位是
		int flag = 1;
		int num = 1;
		// 我们判断第一个字符 是不是‘+’ ‘-’ 如果是的话 我们从下标1开始遍历
		// 如果不是,我们从下标0开始遍历
		if (c[0] == '-') {
			flag = -1;
		} else if (c[0] != '+') {
			num = 0;
		}
		int sum = 0;
		int dny = Integer.MAX_VALUE / 10;
		for (int i = num; i < c.length; i++) {
			// 也就是如果其中出现了非数字的数,我们直接判断这是一个无效输出
			// 返回0
			if (c[i] < '0' || c[i] > '9') {
				return 0;
			}
			if (sum > dny || sum == dny && c[i] > '8') {
				return flag == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
			}
			sum = sum * 10 + (c[i] - '0');
		}
		return sum * flag;
    }

猜你喜欢

转载自blog.csdn.net/qq_40915439/article/details/107409855
今日推荐