zoukankan      html  css  js  c++  java
  • HihoCoder

    说一下题意:

    给你若干行含空格的字符串,让你提取有效数字。

    (一个数据如果左右不为小写字母且没有前导零即可视为有效数字。)

    还要你输出每一行含有几个有效数字。

    特别的:如果存在第i行最后一个字符为数字,第i+1行第一个字符为数据则连接第i行末尾的数据和第i+1行开头的数据。

    上面的题意,在样例中都有体现。

    说一下坑点:

    1、单个数据0 可视为无前导零

    2、先把题意中表示的需要合并的数据合并再判断合并后的数据是否是有效数字

    解法在代码中体现:

    #include<bits/stdc++.h>
    
    #define ll long long
    
    using namespace std;
    
    int a[202],b[202];
    
    /**判断数据是否是actual数**/
    ll getnum(string str)
    {
        int n=str.size();
        if(str[0]>='a'&&str[0]<='z')
            return -1;
        else if(str[n-1]>='a'&&str[n-1]<='z')
            return -1;
        else if(str[0]=='0'&&n!=1)
            return -1;
    
        ll num=0;
        for(int i=0; i<n; i++)
        {
            if(isdigit(str[i]))
            {
                num*=10;
                num+=str[i]-'0';
            }
    
        }
        return num;
    }
    
    
    /**二分搜索**/
    int erfen(int x,int l,int r)
    {
        int mid;
        while(l<r)
        {
            mid=(l+r)>>1;
            if(a[mid]==x)
            {
                return mid;
            }
            else if(a[mid]>x)
            {
                r=mid;
            }
            else if(a[mid]<x)
            {
                l=mid+1;
            }
        }
        return l;
    }
    
    int main()
    {
        /**初始化部分**/
        string str,s;
        str=" ";
        int k=0;
        memset(b,0,sizeof(b));
        a[k++]=str.size();
    
        /**读取数据并标记部分**/
        while(getline(cin,s))
        {
            if(!isdigit(s[0])||!isdigit(str[a[k-1]]))
            {
                str+=" ";
            }
            str+=s;
            a[k++]=str.size()-1;
        }
    
    
        /**提取单个数据并判断**/
        queue<ll>q;
        int l,r;
        int n=str.size();
        int idex;
        ll  num;
        l=r=0;
        while(r<n)
        {
            while(r<n&&str[r]==' ')  r++;
    
            l=r;
    
            while(r<n&&str[r]!=' ') r++;
    
            if(l>=n)
                break;
    
            num=getnum(str.substr(l,r-l));
    
            if(num!=-1)
            {
                q.push(num);
                idex=erfen(l,0,k);
                b[idex]++;
            }
        }
    
    
        /*输出部分*/
        while(!q.empty())
        {
            if(q.size()==1)
                cout<<q.front()<<endl;
            else
                cout<<q.front()<<" ";
            q.pop();
        }
    
        for(int i=1; i<k; i++)
            cout<<b[i]<<endl;
    
        return 0;
    }
    

      

      

  • 相关阅读:
    usb_submit_urb
    xilinx uboot网卡驱动分析
    kernel: swapper: page allocation failure. order:1, mode:0x20
    Linux格式化硬盘 常用命令小记
    spring3:对JDBC的支持 之 JDBC模板类
    spring3: AOP 之代理机制
    spring3: AOP 之切面实例化模型 ——跟我学spring3
    spring3: AOP 之 通知顺序
    spring3: AOP 之 通知参数
    spring3: 切面及通知实例 Aspectj的aop
  • 原文地址:https://www.cnblogs.com/zhangzehua/p/9997039.html
Copyright © 2011-2022 走看看