2017sjtu-String to int

理解题意:输入一个字符出啊str,字符串内可能包括空格 数字 字母 ,输出第一个有效数字

思路:因为cin会忽略有效数据前的所有空格、换行符、Tab,因此考虑cin吸收输入字符串开始的几个空格。

在for循环中遍历整个str: 当ans字符串为空时,所有满足1~9的数字都可以加入ans(0不能做最高位)

当ans字符串不空时,所有满足0~9的数字都可以加入ans;且若此时遍历到了非法字符串(非数字),则跳出循环,此时ans中保存的即为第一个合法数字

若ans长度大于10,跳出循环

判断ans是否为空: 若ans为空,则遍历str,查找是否有0:有0则输出0,否则输出-1表示该字符串没有数字

若ans不空,则判断ans是否在INT_MAX的范围内,此时ans合法的情况:ans长度小于10 或ans长度等于10但字典序小于等于"INT_MAX"

#include <iostream>
#include <string>
#include <climits>

using namespace std;

int main()
{   string str;
    while(cin>>str)//cin去掉字符串前面的空格
    {
        string ans;
        for(int i=0;i<str.size();i++)
        {
            if(ans.empty())//如果ans为空,则此时的有效数字不能是0
            {
                if(str[i]>='1'&&str[i]<='9') ans+=str[i];
            }

            else//ans不空,有效数字可以是0
                if(str[i]>='0'&&str[i]<='9') ans+=str[i];
                else break;//ans不空且遇到了非数字的字符,退出循环

            if(ans.size()>10) break;//ans的值超出int范围(10位),退出循环
        }

        if(ans.empty())//未找到非0开头的数字
        {
            //判断str是否有0
            if(str.find('0')==str.npos) cout<<-1<<endl;
            else cout<<0<<endl;
        }

        else if(ans.size()<10||(ans.size()==10&&ans<="2147483647"))  cout<<ans<<endl;//若ans长度<10或者ans长度==10但是ans字典序小于等于INT_MAX,输出ans

        else cout<<-1<<endl;
    }
}


全部评论

相关推荐

存一千万就可以进大厂实习
石圪节公社发型师:有存一千万的实力还实习个嘚,直接躺平
点赞 评论 收藏
分享
喜欢喜欢喜欢:这是我见过最长最臭的简历
点赞 评论 收藏
分享
白火同学:能。我当初应届沟通了1200,收简历50,面试10左右吧,加油投吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务