【牛客刷题专栏】0x21:JZ20 表示数值的字符串(C语言编程题)

前言

  • 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失
  • 个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer:
    在这里插入图片描述

目录

  • 前言
  • 问题描述:
  • 举例:
  • 解法思路:
  • 代码结果:
  • 结束语


问题描述:

  • 请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。

  • 科学计数法的数字(按顺序)可以分成以下几个部分:
    1.若干空格
    2.一个整数或者小数
    3.(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个整数(可正可负)
    4.若干空格

  • 小数(按顺序)可以分成以下几个部分:
    1.若干空格
    2.(可选)一个符号字符(‘+’ 或 ‘-’)
    3 . 可能是以下描述格式之一:
    3.1 至少一位数字,后面跟着一个点 ‘.’
    3.2 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
    3.3 一个点 ‘.’ ,后面跟着至少一位数字
    4.若干空格

  • 整数(按顺序)可以分成以下几个部分:
    1.若干空格
    2.(可选)一个符号字符(‘+’ 或 ‘-’)
    3 . 至少一位数字
    4.若干空格

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

提示:
1.1 <= str.length <= 25
2.str 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,空格 ’ ’ 或者点 ‘.’ 。
3.如果怀疑用例是不是能表示为数值的,可以使用python的print(float(str))去查看
进阶:时间复杂度O(n) ,空间复杂度O(n)


举例:

//示例1:
//输入:
"123.45e+6"
//返回值:
true
//==========================
//示例2:
//输入:
"1.2.3"
//返回值:
false
//==========================
//示例3:
//输入:
"."
//返回值:
false
//==========================
//示例4:
//输入:
"    .2  "
//返回值:
true

解法思路:

  • 用flag的不同位记录不同的字符的出现状态。

代码结果:

int Check_core_1(char* str, int * flag)
{
    if(str[0]=='\0'&&((*flag)&(0x1<<1))&&(!((*flag)&(0x1<<5))))
        return 1;
    else if (str[0]=='\0')
        return 0;
    if(str[0]==' ')
        return Check_core_1(str+1,flag);
    
    if(str[0]=='+'||str[0]=='-') //符号位判断
    {
        if(!(*flag))
        {
            *flag = (*flag)|(0x1<<0);//最右边的一位表示是否有-+
            return Check_core_1(str+1,flag);
        }
        else if(((*flag)&(0x1<<4)))
        {
            *flag=(*flag)&(~((0x1)<<4));
            return Check_core_1(str+1,flag);
        }
            
        else
            return 0;
    }
    
    *flag=(*flag)&(~((0x1)<<4));//倒数第五位给-的机会消除
    
    if(str[0]>='0'&&str[0]<='9')
    {
        *flag = (*flag)&(~(0x1<<5));//E后面有数字
        
        if(!((*flag)&(0x1)))
            *flag = (*flag)|(0x1<<0);//-+
        
        if(!((*flag)&(0x1<<1)))
            *flag = (*flag)|(0x1<<1);//倒数第二位表示是否有数字
        
        return Check_core_1(str+1,flag);
    }
    
    if(str[0]=='.')
    {
        if(!((*flag)&(0x1)))
            *flag = (*flag)|(0x1<<0);//-+
        
        if(!((*flag)&(0x1<<2))&&!((*flag)&(0x1<<3)))
        {
            *flag = (*flag)|(0x1<<2);//倒数第三位表示是否有小数点
            return Check_core_1(str+1,flag);
        }
        else
            return 0;
        
        
    }
    
    if(str[0]=='E'||str[0]=='e')
    {
        if(!((*flag)&(0x1)))
            *flag = (*flag)|(0x1<<0);//-+
        if(!((*flag)&(0x1<<3))&&((*flag)&(0x1<<1)))
        {
            *flag = (*flag)|(0x1<<3);//倒数第四位表示是否有e
            *flag = (*flag)|(0x1<<4);//倒数第五位给-一次机会
             *flag = (*flag)|(0x1<<5);//倒数第六位看e后面有无数字
            return Check_core_1(str+1,flag);
        }
        else
            return 0;
        
        
    }
    
    return 0;
}

int Check_1(char* str)
{
    int i;
    int len= strlen(str);
    
    for(i=0;i<len;i++)
        if(str[i]>'9'&&str[i]<'0'&&str[i]!='.'
          &&str[i]!='+'&&str[i]!='-'&&str[i]!='E'
          &&str[i]!='e'&&str[i]!=' ')
            return 0;
    return 1;
}

int isNumeric(char* str ) {
    int finish = 0;
    if(!Check_1(str))
        return 0;
    return Check_core_1(str,&finish);
}



结束语

  • 以上就是该C语言编程题的内容。可以在牛客尝试刷几道题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。
  • 题目来自:牛客/题库 / 在线编程 / 剑指offer:
    在这里插入图片描述

你可能感兴趣的:(#,牛客刷题专栏,c语言,软件工程,java)