您的位置:首页 > 其它

串珠问题(今日头条笔试)

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: