题解 | #表示数值的字符串#

表示数值的字符串

http://www.nowcoder.com/practice/e69148f8528c4039ad89bb2546fd4ff8

用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);
}
全部评论

相关推荐

丿南烟丶:黑白模板吧,不要这样花哨的。 主要成就太空了,和获奖融在一起,写一两行就行了。 职业技能不要这样排,就传统的掌握精通什么什么然后举例补充的一些重要技术点。 自我介绍说实话也没啥用,可以删了。 把自己的两个项目方案细节补充上去,为什么这样设计,怎么设计,成果是什么按star法则来写 你要引导面试官来问你的技能和项目,你的获奖和自我介绍别人可能看都不看一眼或者不太在乎,重要的是展示你能干活的能力
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务