错误票据
把所有的数字都放到容器中,上来先排序。起手一个遍历,对于当前数A来说, 断号的条件就是和上一个数做差,只要不是1。就说明数A上一个就是断号,重号就是数A这个值出现不知一次了。很简单。
方法1
// file: 4heap-test.cpp
#include <vector>
#include <iostream>
#include <algorithm>
#include<sstream>
#include<iomanip>
using namespace std;
int convert(string s)
{
stringstream str;
int ex;
str << s; str >> ex;
return ex;
}
int main()
{
int line;
vector<int> a;
//收集每一行空格分割开的来的数字
cin >> line;
getchar();
for (int i = 0; i < line; i++)
{
string s;
getline(cin, s);
stringstream str(s);
string s2;
while (getline(str,s2, ' '))
{
int ex;
ex = convert(s2);
a.push_back(ex);
}
}
//排查,直接从第二个元素开始遍历。
int result1, result2;
sort(a.begin(), a.end());
for (int i = 1; i < a.size(); i++)
{
if (a[i] - a[i - 1] == 2)
{
result1 = a[i] - 1;
}
if (a[i] -= a[i - 1])
{
result2 = a[i];
}
}
cout << result1 << "" << result2;
}
方法2
int a[10005];
int main()
{
int n;
int k = 0;
char ch = ' ';
int i, j = 0, t;
//收集用户输入的所有数字
cin >> n;
for (i = 0; i < n; i++)
{
while (ch != '\n')
{
cin >> t;
ch = getchar();
a[j++] = t;
k++;
}
ch = ' ';
}
//排序遍历,这里从第一个元素开始,因为每一次都要拿当前元素后一个元素比较。所以就遍历到最后一个元素的前一个元素就行了
sort(a,a + k);
int ans1 = 0, ans2 = 0;
for (j = 0; j < k - 1; j++)
{
if (ans1 && ans2)
{
break;
}
if (a[j] == a[j + 1] - 1)
{
continue;
}
else if (a[j] == a[j + 1])
{
ans2 = a[j];
}
else
{
ans1 = a[j] + 1;
}
}
cout << ans1 << "" << ans2;
return 0;
}
方法3
#include <vector>
#include <iostream>
#include <algorithm>
#include<sstream>
#include<iomanip>
using namespace std;
int ans[10005];
char str[100001];
int main()
{
int n;
int i, k = 0;
//存用户输入的所有行,每一行都是空格分割的数字
cin >> n;
getchar();
for (i = 0; i < n; i++)
{
gets_s(str);
char* p;
p = strtok(str, " ");
ans[k++] = atoi(p);
while (p)
{
p = strtok(NULL, " ");
if (p)
{
ans[k++] = atoi(p);
}
}
}
//上来就排序,这里你会char*字符串如果做字符分割就行了
sort(ans, ans + k);
int ans1,ans2 = 0;
for (i = 0; i < k - 1; i++)
{
if (ans[i + 1] - ans[i] == 2)
{
ans1 = ans[i] + 1;
}
if (ans[i + 1] == ans[i])
{
ans2 = ans[i];
}
}
cout << ans1 << "" << ans2;
}