说一下题意:
给你若干行含空格的字符串,让你提取有效数字。
(一个数据如果左右不为小写字母且没有前导零即可视为有效数字。)
还要你输出每一行含有几个有效数字。
特别的:如果存在第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;
}