面試題:給定一個數組,數組中沒有重複的元素,依次遞增。將其表示爲區間形式。
輸入:
[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;
}
運行結果: