字节跳动面试题分享001

246 阅读2分钟

字节面试题分享

本题是 2018校招后端方向(第二批)第二题

因为题干可能比较晦涩难懂,所以我就用自己的话讲出题目,大家可以结合官方的题干来看。

牛客此题入口

题目:手串

题干 一个手串有 n 个珠的手串,每个珠子无色或者有多种颜色, 任一颜色连续的m个珠子上至多出现一次,一共有c中颜色。

此时顺时针告诉你n个珠子,有哪些颜色,求一共有多少中颜色不符合要求?

输入描述:第一行输入n,m,c三个数,接下来n行每行的第一个数表示这个位置有的颜色的个数。接下来依颜色的标号。

输入

5 2 3              表示一共5个珠子,颜色连续2个珠子不能重复,一共三种颜色
3 1 2 3				表示第0个珠子,有三种颜色,分别是颜色1,颜色2,颜色3
0					表示无色
2 2 3
1 2
1 3

输出:2 (表示有两个颜色有问题即不符合要求)
注:【颜色1 -> [0], 颜色2 -> [0,2,3], 颜色3 -> [0,2,4]】

代码与思路:

import java.util.*;
public class Main {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();    //n个串珠
    int m = sc.nextInt();    //手串上的任意一种颜色(不包含无色),在任意连续的m个串珠里至多出现一次
    int c = sc.nextInt();    //颜色一共有c种
    int count = 0;          //结果(有问题颜色的个数)
    Map<Integer,List<Integer>> map = new HashMap<>();		//key表示颜色,value表示珠子编号的集合
    for(int i=0;i < n;i++) {				//第i个珠子
        int num = sc.nextInt();		//第i个珠子颜色的个数
        for(int j=0;j < num;j++) {
            int key = sc.nextInt();
            if(!map.containsKey(key)) {
                List<Integer> list = new ArrayList<>();
                list.add(i);
                map.put(key, list);
            }
            else {
                List<Integer> list = map.get(key);
                list.add(i);
                map.put(key,list);
            }
        }
    }				//获得map颜色1 -> [0], 颜色2 -> [0,2,3],  颜色3 -> [0,2,4]
    for(int i=1;i <= c;i++) {
        boolean flag = false;		//每种颜色只算一次用boolean
        List<Integer> list = map.get(i);	//珠子的集合
        if(list.size() == 1) {
            continue;		//就一个珠子  是 这个颜色
        }
        else {
            for(int j=0;j < list.size()-1;j++) {
                if(list.get(j+1) - list.get(j) < m) {  //前一个减去后一个 
                    count++;
                    flag = true;
                    break;
                }
            }
            if(!flag) {
                if((n-list.get(list.size()-1)+list.get(0)) < m){	//一圈的最后一个和第一个
                    count++;					
                }
            }
        }
    }      											
    System.out.println(count);
}
}

注:list中的值一定是递增的

(大家又不懂得可以问我哦)