题目意思很清晰:
给出一堆数字,这堆数字本应是连续的,但是存在断号和重号的情况,找出出现问题的号码
思路1:
输入所有数字到数组中进行排序,遍历整个数组找到前一个数字与后一个数字相同的位置(重号)、找到后一个数字不等于前一个数字+1的位置(断号),最后输出即可
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int>v;
int num,n, m, t,len;
cin >> t;
while (t--) {//输入
while (cin >> num) {
v.push_back(num);
char ch = getchar();
if (ch == '\n') {
break;
}
}
}
sort(v.begin(), v.end());//排序
len = v.size();
for (int i = 0; i < len-1; i++) {
if (v[i] == v[i + 1]) {//重号
n = v[i];
}
else if (v[i + 1] != v[i] + 1) {//断号
m = v[i] + 1;
}
}
cout << m << " " << n << endl;
return 0;
}
思路2:
取一个数组用来存放每个数字的出现次数,最后遍历整个数组,存在出现次数>1的就是重号,存在前后数字出现次数是>=1而中间数字出现次数为0的就是断号
#include<iostream>
#include<vector>
#define MAX 100005
using namespace std;
int main()
{
int num,n=0, m=0, t,len;
vector<int>v(MAX);
cin >> t;
while (t--) {
while (cin >> num) {
v[num]++;
char ch = getchar();
if (ch == '\n') {
break;
}
}
}
for (int i = 1; i < MAX; i++) {
if (v[i] > 1) {//重号
n = i;
}
if (v[i - 1] && !v[i] && v[i + 1]) {//断号
m = i;
}
if (m && n) {//两个都找到
break;
}
}
cout << m << " " << n << endl;
return 0;
}