(Java 剑指 offer)表示数值的字符串

一、题目解析

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例如,字符串"+100","5e2","-123","3.1416""-1E-16"都表示数值。
但是"12e","1a3.14","1.2.3","+-5""12e+4.3"都不是。

本题关键是对 + - . e E,这5个字符的讨论

(1)e/E,不能同时出现两次,后面一定要接数字
(2)正负号,如果是第一次出现,要么位置在开头,要么紧接在 e/E 之后,如果是第二次出现,必须紧接在 e/E 之后。
(3)小数点,不能出现两次,不能在 e/E 后面出现

二、代码

import java.util.Arrays;
import java.util.Scanner;

/**
 * @Auther: Yolo
 * @Date: 2020/9/11 16:58
 * @Description:
 */
public class Test_11 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入字符串:");
        String next = scanner.next();
        char[] str = next.toCharArray();
        System.out.println(Arrays.toString(str));
        boolean result = isNumeric(str);
        System.out.println(result);
    }

    //e的ascii:101,
    private static boolean isNumeric(char[] str) {
    
    
        //标记符号,小数点,e是否出现过
        boolean sign = false, decimal = false, hasE = false;

        for (int i = 0; i < str.length; i++) {
    
    
            if (str[i] == 'e' || str[i] == 'E') {
    
    
                //e 或 E 的后面一定要接数字,不能是末位出现
                if (i == str.length - 1) {
    
    
                    return false;
                }
                //不能同时存在两个 e/E
                if (hasE) {
    
    
                    return false;
                }
                hasE = true;
            } else if (str[i] == '+' || str[i] == '-') {
    
    
                //第二次出现正负号,必须紧接在 e 之后
                if (sign && str[i - 1] != 'e' && str[i - 1] != 'E') {
    
    
                    return false;
                }
                //第一次出现正负号,如果不是在开头,则也必须紧接在 e之后
                if (!sign && i > 0 && str[i-1] != 'e' && str[i-1] != 'E') {
    
    
                    return false;
                }
                sign = true;
            } else if (str[i] == '.') {
    
    
                //e后面不能接小数点,小数点也不能出现两次
                if (hasE || decimal) {
    
    
                    return false;
                }
                decimal=true;
            } else if (str[i] < '0' || str[i] > '9') {
    
    
                //其余的不合法字符
                return false;
            }
        }
        return true;
    }
}

三、总结

关键是提前对 E/e,小数点,正负号进行标记,从而判断出现的次数

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/108545561