题目翻译:给你一堆连续的数字,但是由于某些原因,造成了一处错误,导致有一个数字与另一个数字相同、有一个数字消失了,导致数字不连续了
该题思路比较简单:我们将这堆数字输入到数组里,计算每个数字出现的次数,最后遍历数组判断哪个数字出现次数为0和哪个数字出现次数为2即可
不过,该题难点主要在于数据的输入,我们需要在只知道数据的行数,不知道每行数据的列数的情况下输入
我们不难想到getchar()来判断空格或者换行符,据此来输入数据
如下
char noth;
int row,i=0,cn=0,num,ans1,ans2;
int nums[100005]={0};
cin>>row;
while(1)
{
cin>>num;
nums[i]=num;
i++;
noth=getchar();//吸收数字后面的字符
if(noth=='\n')
{
cn++;
if(cn==row)//换行符等于行数
{
break;
}
}
}
可是这样真的可以吗?我就使用了该方法输入数据,结果OJ提示运行错误,我调试一番才发现,每一行最后一个元素的后面那个字符是空格而不是换行符,所以该方法不可行!!!
那我们只能采用string的输入方法直接输入一整行来处理数据的输入了
注意
对string s用cin>>s;输入时遇到空格会停下来。如果想要直接录入一整行知道遇到换行符停下来的话就用 getline(cin,s); 来输入,gets也可以输入空格,录入一整行。但是和getline不同的是 gets遇见换行符会变为'\0'输入,而getline是直接抛弃换行符。
据此,我们选择使用getline输入string,由于将每个数字变成了string里的每个字符,我们便需要多一步将字符处理成数字的操作
综上代码转换如下:
#include<bits/stdc++.h>
using namespace std;
string s;
int MAX=0,MIN=INT_MAX;
const int MAXN=100005;
int nums[MAXN];
int main()
{
int n,ans1,ans2;
cin>>n;
getchar();//注意这里一定要加getchar
while(n--)//输入每一行
{
getline(cin,s);
s+=' ';//这里是为了连接后面的数字
int num=0;
for(int i=0;i<s.length();i++)
{
while(s[i]>='0'&&s[i]<='9')//数字字符
{
num=num*10+(s[i]-'0');//转换为数字
i++;//下一个字符
}
if(s[i]==' ')
{
MAX=max(MAX,num);
MIN=min(MIN,num);//寻找数字的最大与最小值
nums[num]++;//数字个数++
num=0;重新初始化
}
}
}
for(int i=MIN;i<=MAX;i++)//遍历所有数字
{
if(nums[i]==0)
{
ans1=i;
}
if(nums[i]==2)
{
ans2=i;
}
}
cout<<ans1<<' '<<ans2<<endl;
return 0;
}
值得注意的是在使用getline之前我们要先用getchar消去n后面的换行符,否则getline会先吸收该换行符