zoukankan      html  css  js  c++  java
  • 剑指OFFER 表示数值的字符串

    剑指OFFER 表示数值的字符串

    这道题主要考察的是对"如何表达数字"的理解,如何对这种表示建立一套可行的规则.

    最初我的想法是从头到尾一个字符一个字符进行扫描,并且前面的扫描会对后面的扫描产生影响(出现无效字符就中断),如果扫描全程都没有被中断那么就判断该字符串是有效的.但是这种方法可读性比较差,会掺杂大量的if else 判断.

    为了简化代码和捋清思路,我还是按照传统的方法,将复杂问题分解成小问题的方式来解决.

    增设两个函数

    一个函数判断是否是纯数字

    一个函数判断是否是带小数点的纯数字

    最后根据e/E的位置对字符串进行分解,然后用上述函数分别进行判断,最终得出结果.

    class Solution {
    public:
        //左闭右开
        //第一个字符一定是+或者-或者0~9
        //之后是只带一个小数点的纯数字
        bool is_number(char* str,int left,int right)
        {
            if(str[left]!='+'&&str[left]!='-'&&str[left]<'0'&&str[left]>'9')
                return false;
            int pos = left + 1;
            bool dot = false;
            while(str[pos]>='0'&&str[pos]<='9'&&pos<right||str[pos]=='.')
            {
                if(str[pos]=='.')
                {
                    if(dot == true)return false;
                    dot = true;
                }
                pos++;
            }
            return pos == right;
        }
        //左闭右开
        //第一个字符一定是+或者-或者0~9
        //之后都是纯数字
        bool is_number_without_dot(char* str,int left,int right)
        {
            if(str[left]!='+'&&str[left]!='-'&&str[left]<'0'&&str[left]>'9')
                return false;
            int pos = left + 1;
            while(str[pos]>='0'&&str[pos]<='9'&&pos<right)
            {
                pos++;
            }
            return pos == right;
        }
        
        bool isNumeric(char* str)
        {
            int pos = 0;//最终pos表示str的长度
            int pos_e = -1;//是否存在e/E
            while(str[pos] != '')
            {
                if(str[pos]=='e'||str[pos]=='E')
                {
                    pos_e = pos;
                }
                pos++;
            }
            if(pos_e == -1)
            {
                //如果不是指数形式,那么只需要判断是否是带小数点的数字即可
                return is_number(str,0,pos);
            }else{
                //如果是指数形式
                //那么就分成两半,左边是带小数点的数字,右边是纯数字分别进行判断
                return is_number(str,0,pos_e) && is_number_without_dot(str,pos_e+1,pos);
            }
        }
    };
    
  • 相关阅读:
    【转载】关于sql的执行计划(推荐详细) 天高地厚
    填充因子 天高地厚
    【转载】基于Windows下的Web性能测试和压力测试 天高地厚
    [转]SQL Server 2008存储结构之GAM、SGAM 天高地厚
    用sp_change_users_login消除Sql Server的孤立用户
    定义类成员
    个人JS脚本验证大全[转]
    网页居中
    转 优先队列 的使用
    java BigInteger
  • 原文地址:https://www.cnblogs.com/virgildevil/p/12179101.html
Copyright © 2011-2022 走看看