博客
关于我
剑指 Offer 20. 表示数值的字符串
阅读量:134 次
发布时间:2019-02-27

本文共 3742 字,大约阅读时间需要 12 分钟。

如何判断一个字符串是否表示数值?我们可以通过逐步分析字符串中的每个字符,确保其符合数值表示的规则。以下是详细的步骤:

1. 去除空格

首先,我们对输入字符串进行去空格处理,这样可以简化后续的处理逻辑。

2. 检查字符串长度

如果字符串长度为0,直接返回false。

3. 遍历每个字符

逐个检查每个字符是否符合数值的要求。

4. 处理符号

允许在开头有符号+或-,但不能在中间或末尾出现(除非是指数部分)。

5. 处理数字

可以是0-9,或者小数点。

6. 处理指数部分

e/E后面必须有数字,可以是正数或负数。

7. 处理小数点

只能出现一次,且不能在中间多次出现,且不能出现在指数部分后面。

8. 特殊情况处理

检查一些特殊情况,如“1.”、“.1”、“46.e3”等,确保它们有效。

9. 返回结果

如果所有检查都通过,返回true,否则返回false。

代码实现

public class Solution {    public boolean isNumber(String s) {        s = s.trim();        if (s.length() == 0) return false;        char[] arr = s.toCharArray();        int len = arr.length;        int countDot = 0;        boolean haveE = false;        for (int i = 0; i < len; i++) {            if (!isnum(arr[i]) && !isnor(arr[i])) {                return false;            }            if (arr[i] == 'e' || arr[i] == 'E') {                if (haveE) {                    return false;                }                haveE = true;                if (i - 1 < 0 || i + 1 >= len) {                    return false;                }                if (!isnum(arr[i - 1]) && arr[i - 1] != '.') {                    return false;                }                if (!isnum(arr[i + 1]) && arr[i + 1] != '-' && arr[i + 1] != '+' && arr[i - 1] != '.' && arr[i + 1] != ' ') {                    return false;                }            }            if (arr[i] == '+') {                if (i == 0) continue;                if (i == len - 1) {                    return false;                }                if (arr[i - 1] == 'e' || arr[i - 1] == 'E') {                    continue;                }                return false;            }            if (arr[i] == '-') {                if (arr[len - 1] == '-') {                    return false;                }                if (i - 1 >= 0 && arr[i - 1] != 'e' && arr[i - 1] != 'E') {                    return false;                }            }            if (arr[i] == '.') {                if (i == 0) {                    countDot++;                    if (i + 1 < len) {                        if (!isnum(arr[i + 1])) {                            return false;                        }                        continue;                    } else {                        return false;                    }                }                if (i == len - 1) {                    countDot++;                    if (countDot > 1) {                        return false;                    }                    if (isnor(arr[i - 1]) && i + 1 >= len) {                        return false;                    }                    if (haveE) {                        return false;                    }                    continue;                }                countDot++;                if (!isnum(arr[i + 1]) && arr[i + 1] != 'e' && arr[i + 1] != 'E') {                    return false;                }                if (haveE) {                    return false;                }                if (countDot > 1) {                    return false;                }            }        }        return true;    }    private boolean isnum(char en) {        char[] num = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };        for (int i = 0; i < 10; i++) {            if (en == num[i]) {                return true;            }        }        return false;    }    private boolean isnor(char en) {        char[] nor = { '+', '-', 'e', 'E', '.' };        for (int i = 0; i < 5; i++) {            if (en == nor[i]) {                return true;            }        }        return false;    }}

代码解释

  • 去除空格:使用trim()方法去掉首尾空格。
  • 空字符串检查:直接返回false。
  • 字符遍历:逐个检查每个字符是否为数字或符号。
  • 指数处理:检查e/E的位置和后前字符是否有效。
  • 符号处理:确保符号不在错误的位置出现。
  • 小数点处理:确保小数点出现次数正确,位置有效。
  • 数字验证isnum方法检查字符是否为数字,isnor方法检查是否为符号或小数点。
  • 通过以上步骤,可以准确判断字符串是否表示有效的数值。

    转载地址:http://skxb.baihongyu.com/

    你可能感兴趣的文章
    OSPF 概念型问题
    查看>>
    OSPF 的主要目的是什么?
    查看>>
    SQL Server 存储过程分页。
    查看>>
    OSPF不能发现其他区域路由时,该怎么办?
    查看>>
    OSPF两个版本:OSPFv3与OSPFv2到底有啥区别?
    查看>>
    SQL Server 存储过程
    查看>>
    OSPF在大型网络中的应用:高效路由与可扩展性
    查看>>
    OSPF太难了,这份OSPF综合实验请每位网络工程师查收,周末弯道超车!
    查看>>
    OSPF技术入门(第三十四课)
    查看>>
    OSPF技术连载10:OSPF 缺省路由
    查看>>
    OSPF技术连载11:OSPF 8种 LSA 类型,6000字总结!
    查看>>
    OSPF技术连载12:OSPF LSA泛洪——维护网络拓扑的关键
    查看>>
    OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
    查看>>
    OSPF技术连载14:OSPF路由器唯一标识符——Router ID
    查看>>
    OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
    查看>>
    OSPF技术连载16:DR和BDR选举机制,一篇文章搞定!
    查看>>
    OSPF技术连载17:优化OSPF网络性能利器——被动接口!
    查看>>
    OSPF技术连载18:OSPF网络类型:非广播、广播、点对多点、点对多点非广播、点对点
    查看>>
    OSPF技术连载19:深入解析OSPF特殊区域
    查看>>
    SQL Server 复制 订阅与发布
    查看>>