zoukankan      html  css  js  c++  java
  • [LeetCode] 65. Valid Number

    Validate if a given string can be interpreted as a decimal number.

    Some examples:

    "0" => true
    " 0.1 " => true
    "abc" => false
    "1 a" => false
    "2e10" => true
    " -90e3   " => true
    " 1e" => false
    "e3" => false
    " 6e-1" => true
    " 99e2.5 " => false
    "53.5e93" => true
    " --6 " => false
    "-+3" => false
    "95a54e53" => false

    Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one. However, here is a list of characters that can be in a valid decimal number:

    • Numbers 0-9
    • Exponent - "e"
    • Positive/negative sign - "+"/"-"
    • Decimal point - "."

    Of course, the context of these characters also matters in the input.

    Update (2015-02-10):
    The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.

    有效数字。剑指Offer里有一道一模一样的题。唯一多的case是对数函数底数e是有大小写的。

    题意是给你一个input字符串,请你判断他是否为有效数字。题目没有给出非常具体的有效数字的定义,但是给了一些例子帮你理解什么叫有效什么叫无效。

    思路只能是从例子下手了。注意到这么几点

    • 首先input字符串里面一定需要有数字
    • 之后需要判断是否有e,如果有e,则必须先看到数字才行,否则就是错的
    • 如果碰到小数点,但是是在e之后或者已经出现过小数点了,就是错的
    • 如果遇到加减号,看一下是不是在input的首位或者在不在e之后的那一位上,如果不满足则是错的
    • 最后判断有没有遇到数字

    照着这个思路,代码就不难写了。但是有的case,讨论区很多同学都不认同,我也在这里分享出来。

    test(1, "123", true);
    test(2, " 123 ", true);
    test(3, "0", true);
    test(4, "0123", true);  //Cannot agree
    test(5, "00", true);  //Cannot agree
    test(6, "-10", true);
    test(7, "-0", true);
    test(8, "123.5", true);
    test(9, "123.000000", true);
    test(10, "-500.777", true);
    test(11, "0.0000001", true);
    test(12, "0.00000", true);
    test(13, "0.", true);  //Cannot be more disagree!!!
    test(14, "00.5", true);  //Strongly cannot agree
    test(15, "123e1", true);
    test(16, "1.23e10", true);
    test(17, "0.5e-10", true);
    test(18, "1.0e4.5", false);
    test(19, "0.5e04", true);
    test(20, "12 3", false);
    test(21, "1a3", false);
    test(22, "", false);
    test(23, "     ", false);
    test(24, null, false);
    test(25, ".1", true); //Ok, if you say so
    test(26, ".", false);
    test(27, "2e0", true);  //Really?!
    test(28, "+.8", true);  
    test(29, " 005047e+6", true);  //Damn = =|||

    时间O(n)

    空间O(1)

    Java实现

     1 class Solution {
     2     public boolean isNumber(String s) {
     3         boolean eSeen = false;
     4         boolean numSeen = false;
     5         boolean dotSeen = false;
     6         s = s.trim();
     7         for (int i = 0; i < s.length(); i++) {
     8             char c = s.charAt(i);
     9             if (Character.isDigit(c)) {
    10                 numSeen = true;
    11             } else if (c == 'e' || c == 'E') {
    12                 if (eSeen || !numSeen) {
    13                     return false;
    14                 }
    15                 eSeen = true;
    16                 numSeen = false;
    17             } else if (c == '.') {
    18                 if (eSeen || dotSeen) {
    19                     return false;
    20                 }
    21                 dotSeen = true;
    22             } else if (c == '-' || c == '+') {
    23                 if (i != 0 && s.charAt(i - 1) != 'e' && s.charAt(i - 1) != 'E') {
    24                     return false;
    25                 }
    26             } else {
    27                 return false;
    28             }
    29         }
    30         return numSeen;
    31     }
    32 }

    LeetCode 题目总结

  • 相关阅读:
    java类型比较_Java数据类型的比较
    学习方法-1:海绵学习法
    性能测试:TPS和QPS的区别
    代码反思
    网站TLS升级 1.0&1.1--1.2
    Mysql常用语法
    初级测试工程师面试指南
    postman实战之断言
    postman预处理脚本实战
    什么是HTTP超文本协议
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13322078.html
Copyright © 2011-2022 走看看