题目

给定n个整数(0-100),其中0可以替换成任意其他数字,要求判断这n个整数是否连续?(存在重复数字也判定为连续)

例:
输入:0,5,6,7,8,10
解释:将0替换成9,这n个整数可判定为连续
输出:True
输入:5,6,7,9,8,10
解释:顺序无关
输出:True
输入:5,5,6,7,8
输出:True

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <cstring>

int main(){
const int kMaxNum = 100;
bool flag[kMaxNum];
memset(flag,0, sizeof(flag));

int num;
int zero_num = 0;
// 将数据存到 bool 的数组中,存取的时候已经排除了重复元素的影响
while(std::cin>>num) {
if (!num) {
++zero_num;
} else {
flag[num - 1] = true;
}
if (std::cin.get() == '\n')
break;
}
// 标记开始和结束为止
int32_t start = 0;
int32_t end = 99;
for (int i = 0; i < kMaxNum; i++) {
if(flag[i]) {
start = i;
break;
}
}
for (int i = kMaxNum - 1; i >=0; i--) {
if(flag[i]) {
end = i;
break;
}
}
// 再次遍历有效区间,假设用 0 来填充所有空白,一旦 0 的数量不够,就说明不是连续数组
for (int i = start; i <= end; ++i) {
if(!flag[i] && (zero_num--)<0){
std::cout<<"False"<<std::endl;
return 0;
}
}
std::cout<<"True"<<std::endl;
return 0;
}

进阶

增加难度的额外需求:
若98,99,100,1,2,3,也当作连续数组,即最大数字100后接上最小数字1也计为连续,如何修改代码实现?
例:
输入:98,99,100,1,2,3
输出:True
输入:0,98,99,1,2,3
输出:True

写个思路吧。。
存数据的过程是一样的。。然后随便取一个 1 为起点,然后递增遍历 100 个,每次记录下一个 1 之间的 0 的个数,如果剩余 0 的个数足够填满这些个 1 ,就继续;不够的话,就记录目前 1 的位置,然后返回起点,递减按同样的方式处理,如果到了不够填满 0 的位置正好是上一次记录的,那么输出 true,否则输出 false