前段时间做了一下招银的在线笔试,里面有道成就完成的编程题,当时没有完全做对,有部分测试没通过,事后完善了一下。
题目:n个成就,第i天完成第i个成就,但是当次成就可能需要完成前置成就,如果之前完成了所有成就,之后当天可以休息。
例子:
输入:
5 2 3 5 1 4 2 2 5 0 1 4
输出:
4 1 0 1 0
例子说明:第一行是数表明有5个成就,第二行应该是第一天完成第一个成就,但是需要完成前置成就2、3、 5成就,所以第一天需要完成4个成就,第三行需要完成成就2,但是有前置成就1、4,由于第一天完成了1,2成就,所以第二天完成4就可以了,以此类推
代码如下:
/* * 招银笔试 * 成就完成 * n个成就,第i天完成第i个成就,但是当次成就可能需要前置成就,如果之前完成之后当天可以休息 */ import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Scanner; import java.util.Set; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=Integer.parseInt(sc.nextLine()); String[] str=new String[n]; int[][] ai=new int[n][n]; boolean flag=true; Set<Integer> set=new HashSet<Integer>(); List<Integer> list=new ArrayList<Integer>(); int num; for(int i=0;i<n;i++){ num=0; str=sc.nextLine().split(" "); for(int j=0;j<str.length;j++){ if(str[j]!=null){ ai[i][j]=Integer.parseInt(str[j]); if(!set.contains(ai[i][j])){ num++; set.add(ai[i][j]); } } } if(set.contains(i+1)){ list.add(num); }else{ set.add(i+1); list.add(num+1); } } for(int i=0;i<n;i++){ System.out.print(list.get(i)+" "); } } }