一串首尾相连的珠子(m个),有N种颜色(N<=10),取出其中一段,要求包含所有N中颜色,并使长度最短
2010-12-03 16:08
585 查看
#include <time.h> #include <stdlib.h> #include <vector> #include <iostream> using namespace std; void createRandArr(int *, int, int); void printfRandArr(int* , int); int countMaxUnique(int* , int); int getMaxCoverLen(int* , int, int); //生成随机数组 void createRandArr(int* randArr, int len, int top=10) { srand((int)time(0)); for (int i = 0; i < len; ++i) { randArr[i] = rand()%top; } } //输出随机数组 void printfRandArr(int* randArr, int len) { for (int i = 0; i < len; ++i) { cout << randArr[i] << " "; } cout << endl; } //求出数组中不同元素的个数 int countMaxUnique(int* arr, int len) { int ret = 0; int i, j; bool flag = true; for (i = 0; i < len; ++i) { flag = true; for (j = 0; j < i; ++j) { if (arr[j] == arr[i]) { flag = false; break; } } if (flag) { ++ret; } } return ret; } //以index为起点,环形扫描数组,返回最大覆盖的长度 int getMaxCoverLen(int* arr, int len, int index) { vector<int> maxCoverSeq; //保存以index为起始,并有最大覆盖的数 vector<int> maxUniqueSeq; //保存以index为起始,不相同的数 int maxCover = countMaxUnique(arr, len); int count = 0; //数组不同数,计数 bool flag = true; int i,j,k; // from index to end for (i = index; i < len; ++i) { flag = true; maxCoverSeq.push_back(arr[i]); for (j = index; j < i; ++j) { if (arr[j] == arr[i]) { flag = false; break; } } if (flag) { ++count; maxUniqueSeq.push_back(arr[i]); } if (count == maxCover) { return maxCoverSeq.size(); } } //from begin to index for (i = 0; i < index; ++i) { flag = true; maxCoverSeq.push_back(arr[i]); for (k = 0; k < maxUniqueSeq.size(); ++k) { if (arr[i] == maxUniqueSeq[k]) { flag = false; break; } } if (flag) { ++count; maxUniqueSeq.push_back(arr[i]); } if (count == maxCover) { return maxCoverSeq.size(); } } return maxCoverSeq.size(); } int main(int argc, char* argv[]) { int arr[15]; int len = sizeof(arr) / sizeof(int); createRandArr(arr, len, 15); int ret = countMaxUnique(arr, len); cout << "random array is: " << endl; printfRandArr(arr,len); cout << "arr len = " << len << ", unique = " << ret << endl; cout << endl; int i; int min = 10000; int index = 0; //循环求最小 for (i = 0; i < len; ++i) { ret = getMaxCoverLen(arr, len, i); if (ret < min) { min = ret; index = i; } } cout << "min = " << min << ", index at " << index << endl; if (min + index > len) { for (i = index; i < len; ++i) { cout << arr[i] << " "; } for (i = 0; i < min + index - len; ++i) { cout << arr[i] << " "; } cout << endl; } else { for (i = index; i < index + min; ++i) { cout << arr[i] << " " ; } } cout << endl; return 0; } //结果
相关文章推荐
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。
- 【编程题目】一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),取出其中一段,要求包含所有 N 中颜色,并使长度最短。
- 一串首尾相连的珠子(m个),有N种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10), 设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 字符串匹配之通配符问题------一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
- 字符串匹配之通配符问题------一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度
- 一串首尾相连的珠子(m个),有n种颜色(n<=10) 设计一种算法去除其中一段,要求包含所有的N种颜色
- 40_2 取出首尾相连的珠子中一段,要求包含所有N颜色,并长度最短。 滑动窗口问题
- 一串首尾相连的珠子(m个),有N种颜色(N<=10),使得最短的字符串包含全部颜色
- 有一串首尾相连的珠子,共有m个,每一个珠子有一种颜色,并且颜色的总数不超过n(n<=10),求连续的珠子的颜色总数为n时,长度最小的区间。
- 一串首尾相连的珠子共m个,其中有n中颜色,求出包含全部这n种颜色的最短的串。
- 34. 百度研发笔试题: 一串首尾相连的珠子(m个),有N种颜色(N<=10)
- 求珠子上最短的包含所有颜色的子串
- 第八题:牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因,其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。
- ACM457现在给出了一个只包含大小写字母的字符串,不含空格和换行,要求把其中的大写换成小写,小写换成大写,然后输出互换后的字符串。输入 第一行只有一个整数m(m<=10),表示测试数据组数。