手撕代码--将一个数组中连续的数表示成区间的形式

面试题:给定一个数组,数组中没有重复的元素,依次递增。将其表示为区间形式。
输入:
[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;
}

运行结果:
在这里插入图片描述

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