错误票据
某涉密单位下发了某种票据, 并要在年终全部收回.
每张票据有唯一的 ID 号. 全年所有票据的 ID 号是连续的, 但 ID 的开始数码是随机选定的.
因为工作人员疏忽, 在录入 ID 号的时候发生了一处错误, 造成了某个 ID 断号, 另外一个 ID 重号.
你的任务是通过编程, 找出断号的 ID 和重号的 ID.
假设断号不可能发生在最大和最小号.
要求程序首先输入一个整数 N(N<100)表示后面数据行数.
接着读入 N 行数据.
每行数据长度不等, 是用空格分开的若干个 (不大于 100 个) 正整数(不大于 100000)
每个整数代表一个 ID 号.
要求程序输出 1 行, 含两个整数 m n, 用空格分隔.
其中, m 表示断号 ID,n 表示重号 ID
例如:
用户输入:
- 2
- 5 6 8 11 9
- 10 12 9
则程序输出:
7 9
再例如:
用户输入:
- 6
- 164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
- 172 189 127 107 112 192 103 131 133 169 158
- 128 102 110 148 139 157 140 195 197
- 185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
- 149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
- 113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
则程序输出:
105 120
资源约定:
峰值内存消耗 <64M
CPU 消耗 < 1000ms
请严格按要求输出, 不要画蛇添足地打印类似:"请您输入..." 的多余内容.
所有代码放在同一个源文件中, 调试通过后, 拷贝提交该源码.
注意: main 函数需要返回 0
注意: 只使用 ANSI C/ANSI C++ 标准, 不要调用依赖于编译环境或操作系统的特殊函数.
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>,
不能通过工程设置而省略常用头文件.
提交时, 注意选择所期望的编译器类型.
我的思路是, 这一连串的数据一定是连续的 (除了断点和重点), 那么我们可以把所有数据都储存起来, 排序后一一比对, 若有哪边不是连续的再做出后续判断. 有个要注意的点就是数据是一行行输入的, 每行有多少个数据不确定, 所以我们要用到 getline() 函数. c++ reference 上的定义:
- istream& getline (istream& is, string& str, char delim);
- istream& getline (istream& is, string& str);
- Get line from stream into string
- Extracts characters from is and stores them into str until the delimitation character
- delim is found (or the newline character, '\n', for (2)).
也就是说这个函数可以把输入流 is 中的字符提取到字符串 str 中去, 直到遇到分隔符或是换行符. 因为在前面我们输入 n 后又从键盘输入了一个换行, 而 getline 会吃换行, 所以在 getline 之前我们一定要 getchar 一下, 把前面的那个换行符给吃掉.(详细解释可点这里 https://www.cnblogs.com/Aikoin/p/9312953.html )又因为这些数字都是用空格分开的, 所以我们很自然地想到 stringstream.(前面有一题也有类似的用法, 可以戳这里 https://www.cnblogs.com/Aikoin/p/10486067.html )具体 stringstream 的用法还是要多练多琢磨, 常用的有字符串和数字的相互转换等等.
这是我的代码(CPU 使用: 0ms 内存使用: 932.0KB)
- #include <iostream>
- #include <sstream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main(){
- int n;
- int m,q;
- vector<int> v;
- cin>>n;
- getchar();
- for(int i = 0;i<n;i++){
- string s;
- getline(cin,s);
- stringstream ss(s);
- int a;
- while(ss>>a){
- v.push_back(a);
- }
- }
- sort(v.begin(),v.end());
- for(int i = 1;i<v.size();i++){
- if(v[i]!=v[i-1]+1){
- if(v[i]==v[i-1]) q = v[i];
- else m = v[i]-1;
- }
- }
- cout<<m<<" "<<q;
- return 0;
- }
下面是看的蓝桥杯直播课老师的部分代码, 思路差不多, 但是用到了 getline 分隔符的用法, 所以也 po 一下:
- for (int i = 0; i < line; ++i) {
- string s;
- getline(cin, s);
- istringstream iss(s); // 把获取到的字符串放进输入流中
- string tmp;
- while (getline(iss, tmp, ' ')) { // 再用带分隔符参数的 getline 提取数字
- s2i(tmp, data[index++]);
- }
- }
来源: http://www.bubuko.com/infodetail-2982148.html