美文网首页IT@程序员猿媛
今日头条2018年秋招后端第三批手串问题

今日头条2018年秋招后端第三批手串问题

作者: zhouwaiqiang | 来源:发表于2019-03-19 11:06 被阅读0次

    题目描述

    作为一个手串艺人,有金主向你订购了一条包含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颗柱子上包
    含第x种颜色(1 <= x <= c)
    

    输出描述

    一个非负整数,表示该手链上有多少种颜色不符需求。
    

    输入例子

    5 2 3
    3 1 2 3
    0
    2 2 3
    1 2
    1 3
    

    输出例子

    2
    

    例子说明

    第一种颜色出现在第1颗串珠,与规则无冲突。
    第二种颜色分别出现在第 1,3,4颗串珠,第3颗与第4颗串珠相邻,所以不合要求。
    第三种颜色分别出现在第1,3,5颗串珠,第5颗串珠的下一个是第1颗,所以不合要求。
    总计有2种颜色的分布是有问题的。 
    这里第2颗串珠是透明的。
    

    解题思路

    1. 首先输入了珠子个数n 要求连续珠串不能重复的个数是m,串珠颜色有c种
    2. 这道题也是需要设计一个良好的数据结构才能求解
    3. 我们可以把这个串珠和颜色设计为一个二维矩阵,行向量是每一个串珠,列向量是串珠颜色
    ,列向量总数为c,如果在i行j列上的这个数对应的串珠的位置没有这个颜色那么置0.简言之,
    就是将每个串珠的颜色都扩充为一样的c种,原本拥有的就为1,没有的就为0,那么就可以设计
    为一个0-1表示的二维矩阵,如下图中所示
    4. 其次,再研究研究输出结果,是要求不满足m个串珠连续的颜色总和,那么这个问题就转变为了我对每种颜色检查是否符合结果
    5. 针对每一种颜色检查的是否有连续个m个串珠针对同一种颜色同时出现了两个1(针对矩阵而言),因为需要针对同一种颜色从第一个串珠(第一行)检查到最后一个串珠(最后一行),那么整体的遍历结束就会结束于n+m(因为到达最后一行相邻的串珠是第一行开始到n-1)
    6. 依次检查每一列是否符合要求即可得到最后的总数
    
    示例图(转载请附链接)

    Java源代码

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int m = sc.nextInt();
            int c = sc.nextInt();
            byte[][] matrix = new byte[n][c];
            for (int i=0; i<n; i++) {
                int total = sc.nextInt();
                for (int j=0; j<total; j++) {
                    int k = sc.nextInt();
                    matrix[i][k-1] = 1;
                }
            }
            byte[] result = new byte[c];
            for (int i=0; i<c; i++) {
                int lastIndex = -1;
                int end = n+m-1;
                //System.out.println("end is:" + end);
                for (int j=0; j<end; j++) {
                    int row = j%n;
                    if(matrix[row][i]==1) {
                        if (lastIndex==-1) lastIndex = j;
                        else {
                            if (j-lastIndex < m) result[i] = 1;
                            else {
                                lastIndex = j;
                            }
                        }
                    }
                }
            }
            int sum = 0;
            for (int i=0; i<c; i++) {
                if (result[i] ==1) sum++;
            }
            System.out.println(sum);
        }
    }
    
    
    
    

    相关文章

      网友评论

        本文标题:今日头条2018年秋招后端第三批手串问题

        本文链接:https://www.haomeiwen.com/subject/hbfgmqtx.html