字节面试题分享
本题是 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中的值一定是递增的
(大家又不懂得可以问我哦)