字符串转换整数_8_65

LeetCode_8原题链接: https://leetcode-cn.com/problems/valid-number/

LeetCode_65原题链接:https://leetcode-cn.com/problems/valid-number/submissions/

package Leetcode;
import java.util.Scanner;

/**
 * @date 2022/4/4-20:21
 * 请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
 *
 * 函数myAtoi(string s) 的算法如下:
 * 1. 读入字符串并丢弃无用的前导空格
 * 2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。
 *    确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
 * 3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
 * 4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。
 *    如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
 * 5. 如果整数数超过 32 位有符号整数范围 [−2^31, 2^31− 1] ,需要截断这个整数,使其保持在这个范围内。
 *    具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31− 1 的整数应该被固定为 2^31− 1 。
 * 6. 返回整数作为最终结果。
 *
 */

public class myAtoi {

    public static int myAtoi(String str) {
        int len = str.length();
        int index = 0;
        while(index < len) {  // 将str的前导空格去掉
            if(str.charAt(index) != ' ') {
                break;
            }
            index++;
        }
        if(index == len) {
            return 0;
        }
        int sign = 1;
        char firstChar = str.charAt(index); // 确定str的符号
        if (firstChar == '+') {
            sign = 1;
            index++;
        } else if(firstChar == '-') {
            sign = -1;
            index++;
        }
        int res = 0;
        while(index <len) {
            char curChar = str.charAt(index);
            if(curChar > '9' || curChar < '0') { // 确定str的正确范围
                break;
            }
            if(res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (curChar - '0' > Integer.MAX_VALUE % 10))) {
                return Integer.MAX_VALUE;
            }
            if(res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (curChar - '0' > -(Integer.MIN_VALUE % 10)))) {
                return Integer.MIN_VALUE;
            }
            res = res * 10 + sign * (curChar - '0');
            index++;
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println("Please input the value of str");
        Scanner in = new Scanner(System.in);
        String str = in.next();
        System.out.println("The result after call method is:\n" + myAtoi(str));
    }
}

 

LeetCode_65:判断给的字符串是否是有效的数字
      有效数字(按顺序)可以分成以下几个部分:
      1.一个 小数 或者 整数
      2.(可选)一个 'e' 或 'E' ,后面跟着一个 整数
 
      1.小数(按顺序)可以分成以下几个部分:
          1.(可选)一个符号字符('+' 或 '-'2.下述格式之一:
              1.至少一位数字,后面跟着一个点 '.'
              2.至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
              3.一个点 '.' ,后面跟着至少一位数字
      2.整数(按顺序)可以分成以下几个部分:
          1.(可选)一个符号字符('+' 或 '-'2.至少一位数字
 
    public boolean isNumber(String s) {
        if(s == null || s.length() == 0) {
            return false;
        }
        boolean numSeen = false;
        boolean dotSeen = false;
        boolean eSeen = false;
        char[] arr = s.trim().toCharArray();
        for(int i = 0; i < arr.length; i ++) {
            if(arr[i] >= '0' && arr[i] <= '9') {
                numSeen = true;
            } else if(arr[i] == '.') {
                if(dotSeen || eSeen) {
                    return false;
                }
                dotSeen = true;
            } else if(arr[i] == 'E' || arr[i] == 'e') {
                if(eSeen || !numSeen) {
                    return false;
                }
                eSeen = true;
                numSeen = false;
            } else if(arr[i] == '+' || arr[i] == '-') {
                if(i != 0 && arr[i - 1] != 'e' && arr[i - 1] != 'E'){
                    return false;
                }
            } else {
                return false;
            }
        }
        return numSeen;
    }

 

posted @ 2022-04-04 21:56  2022年总冠军gogogo  阅读(43)  评论(0)    收藏  举报