网易笔试四题代码交流
1.ac(最大公约数,辗转相除法,注意Long)
2.60%(应该可二分优化)
3.60%(并查集,但是我忘记了)
4.ac(多源BFS)
第一题:
public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); long[] input=new long[n]; List<Long> list=new ArrayList<>(); for(int i=0;i<n;i++){ input[i]=sc.nextLong(); if(i>=1){ long temp=input[i]-input[i-1]; if(temp<=0){ System.out.println(-1); return; } list.add(temp); } } if(list.size()==0){ System.out.println(-1); return ; } if(list.size()==1){ System.out.println(list.get(0)); return ; } long res=list.get(0); for(int i=1;i<list.size();i++){ res=getGcd(res,list.get(i)); } System.out.println(res==0?-1:res); } public static long getGcd(long a,long b){ if(b==0)return a; return getGcd(b,a%b); } }第二题:
public class Main1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int D=sc.nextInt(); Point[] ps=new Point[n]; for(int i=0;i<n;i++){ ps[i]=new Point(); ps[i].broken=sc.nextInt(); } for(int i=0;i<n;i++){ ps[i].attack=sc.nextInt(); } //从破防能力低的走起,破防上升 Arrays.sort(ps,(a,b)->a.broken-b.broken); int res=0; for(int i=0;i<n;i++){ if(ps[i].broken>D){ //破防了 res+=ps[i].attack; }else{ D++; } } System.out.println(res); } } class Point{ public int broken; public int attack; public Point(){ } }第三题:
public class Main2 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); int f=sc.nextInt(); HashSet<Integer> infected=new HashSet<>(); for(int i=0;i<m;i++){ int q=sc.nextInt(); //一次聚会的人 Set<Integer> set=new HashSet<>(); //标志是否有感染者 boolean inf=false; for(int j=0;j<q;j++){ set.add(sc.nextInt()); for(int infect:infected){ if(set.contains(infect)){ inf=true; } } } if(inf){ infected.addAll(set); } } System.out.println(infected.size()); } }第四题:
public class Main3 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n =sc.nextInt(); int m=sc.nextInt(); int[][] input=new int[n][m]; int[][] used=new int[n][m]; int[][] res=new int[n][m]; LinkedList<P> list=new LinkedList<>(); //从多个怪兽出发,然后最短能占领的就step for(int i=0;i<n;i++){ char[] carr=sc.next().trim().toCharArray(); for(int j=0;j<m;j++) { input[i][j]=carr[j]-'0'; if(input[i][j]==0){ P p=new P(); p.x=i; p.y=j; list.add(p); } } } int step=0; // while(!list.isEmpty()){ int size=list.size(); for(int i=0;i<size;i++){ P cur=list.pollFirst(); int curx=cur.x; int cury=cur.y; if(input[curx][cury]==1){ res[curx][cury]=step; } //左右走,看哪些没有走过且是1的 if(curx-1>=0&&used[curx-1][cury]==0&&input[curx-1][cury]==1){ used[curx-1][cury]=1; P p=new P(); p.x=curx-1; p.y=cury; list.add(p); } if(cury-1>=0&&used[curx][cury-1]==0&&input[curx][cury-1]==1){ used[curx][cury-1]=1; P p=new P(); p.x=curx; p.y=cury-1; list.add(p); } if(curx+1<n&&used[curx+1][cury]==0&&input[curx+1][cury]==1){ used[curx+1][cury]=1; P p=new P(); p.x=curx+1; p.y=cury; list.add(p); } if(cury+1<m&&used[curx][cury+1]==0&&input[curx][cury+1]==1){ used[curx][cury+1]=1; P p=new P(); p.x=curx; p.y=cury+1; list.add(p); } } step++; } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ System.out.print(res[i][j]+" "); } System.out.println(); } } } class P{ public int x; public int y; public int flag=1; public P(){ } }