面试题:给定一个数组,数组中没有重复的元素,依次递增。将其表示为区间形式。
输入:
[1,2,3,5,7,8,9,40,50,60]
输出:
[1,2,3]
[5,5]
[7,8,9]
[40,40]
[50,50]
[60,60]
思路:
设置一个标志数组is_visited,保存元素是否被访问过。双重for循环遍历所有的连续的数,将其保存到二维数组res中,最后打印出来。
代码:
IDE:vs2013
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <list>
#include <algorithm>
#include <sstream>
using namespace std;
void test01(vector<int>& v){
int len = v.size();
vector<bool> is_visited(len, false);
vector<vector<int>> res;
for (int i = 0; i < len; ++i){
if (is_visited[i]) continue;
vector<int> tmp;
tmp.push_back(v[i]);
for (int j = i+1; j < len; ++j){
if (v[j] == v[j - 1]+1){
tmp.push_back(v[j]);
is_visited[j] = true;
}
else{
break;
}
}
if (tmp.size() == 1){
tmp.push_back(tmp[0]);
}
res.push_back(tmp);
}
// print
int row = res.size();
for (int i = 0; i < row; ++i){
bool is_begin = true;
cout << "[";
for (int j = 0; j < res[i].size(); ++j){
if (is_begin){
cout << res[i][j];
is_begin = false;
}
else{
cout << ","<<res[i][j];
}
}
cout << "]" << endl;
}
}
int main()
{
vector<int> v = {1, 2, 3, 5, 7, 8, 9, 40, 50, 60};
test01(v);
system("pause");
return 0;
}
运行结果: