串珠问题(今日头条笔试)
2017-09-13 22:00
417 查看
求m个相邻串珠上,颜色出现重复的个数
作为一个手串艺人,有金主向你订购了一条包含n个杂色串珠的手串——每个串珠要么无色,要么涂了若干种颜色。为了使手串的色彩看起来不那么单调,金主要求,手串上的任意一种颜色(不包含无色),在任意连续的m个串珠里至多出现一次(注意这里手串是一个环形)。手串上的颜色一共有c种。现在按顺时针序告诉你n个串珠的手串上,每个串珠用所包含的颜色分别有哪些。请你判断该手串上有多少种颜色不符合要求,即询问有多少种颜色在任意连续m个串珠中出现了至少两次。输入描述:
第一行输入n,m,c三个数,用空格隔开。(1<=n<=10000, 1<=m<=1000, 1<=c<=50) 接下来n行每行的第一个数num_i(0<=num_i<=c)表示第i颗珠子有多少种颜色。接下来依次读入num_i个数字,每个数字x表示第i颗珠子上包含的颜色(1<=x<=c)
输出描述:
一个非负证书,表示该手链上有多少种颜色不符需求。
示例:
5 2 3
3 1 2 3
0
2 2 3
1 2
1 3
说明
第一种颜色出现在第1颗串珠,与规则无冲突。
第二种颜色分别出现在第1,3,4颗串珠,第3颗与第4颗串珠相邻,所以不合要求。
第三种颜色分别出现在第1,3,5颗串珠,第5颗串珠的下一个是第1颗,所以不合要求。
总计有2种颜色的分布式有问题的。
这里第2颗串珠是透明的。
解决思路
第一种
按照说明的方法来 求出每种颜色出现在那些串珠的位置上,对不符合要求的串珠作统计:第二种
滑动窗口 第一次读取前m行,记录每种颜色出现的次数,将不满足要求的颜色计数,通过过的颜色不再进行运算;然后往下读取,进行n-1次,将原来m行中最上面有的颜色的计数值减1,再将最新的一行中的颜色计数加1,重复第一步的检测:#include <iostream> using namespace std; int main() { int n = 5, m = 2, c = 3; int arr[5][5] = {{3,1,2,3,-1},{0,-1,-1,-1,-1},{2,2,3,-1,-1},{1,2,-1,-1,-1},{1,3,-1,-1,-1}}; int color_count[4] = {0}; // 记录在m个相邻的串珠上,每种颜色出现的次数 int count = 0; // 记录有多少个颜色不符合要求 int color; int i = 0, j = 0; for (i = 0; i < m; i++) { for (int k = 1; k < arr[i][0]+1; k++) { if (arr[i][0] == 0) { color_count[0]++; break; } color_count[arr[i][k]]++; } } for (int color = 0; color < c+1; color++) { if (color_count[color] > 1) { count++; color_count[color] = -1; } } if (count == c+1) { return count; } int loop = 1; for (i = m; ;) { if (loop == n) { break; } for (int k = 1; k < arr[i-m][0]+1; k++) { if (arr[i-m][0] == 0) { color_count[0]--; // 将无色减1 break; } if (color_count[arr[i-m][k]] == -1 || color_count[arr[i-m][k]] == 0) continue; color_count[arr[i-m][k]]--; } for (int k = 1; k < arr[i][0]+1; k++) { if (color_count[arr[i][k]] == -1) continue; color_count[arr[i][k]]++; } for (int color = 0; color < c+1; color++) { if (color_count[color] > 1) { count++; color_count[color] = -1; } } if (count == c+1) { return count; } i = (++i) % n; loop++; } cout << count; cin.get(); return count; }
相关文章推荐
- 将字符串编码成数值,求数值最大和问题(今日头条笔试题)
- 数组元素前移问题(今日头条笔试题)
- 数组元素前移问题(今日头条笔试题)
- 今日头条笔试之手串问题
- 多边形构成问题(今日头条笔试题)
- 今日头条2018校招笔试题之字符串的问题
- 今日头条笔试题,任务调度问题
- 多边形构成问题(今日头条笔试题)
- 将字符串编码成数值,求数值最大和问题(今日头条笔试题)
- 今日头条最大点问题
- [今日头条] 2017客户端工程师实习生笔试题
- 括号匹配--今日头条2017年实习生招聘笔试题
- 20170330今日头条笔试题
- Java编程题:今日头条笔试题
- 【牛客网】马三来刷题之回文解码(今日头条2017年客户端实习在线笔试题)
- 2017年4月18日今日头条笔试原题D题
- 2018今日头条内推笔试1
- 2018春招-今日头条笔试题-第三题(python)
- Python实现互联网笔试题-今日头条-3个一组的试题
- 今日头条2017后端工程师实习生笔试题