手撕代碼--將一個數組中連續的數表示成區間的形式

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

運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章