网易2018校园内推编程题
https://www.nowcoder.com/test/6291726/summary
题目一:有A-Z的一群字符,这些字符可以组合成N个组合,求在保证最多只有两个相邻字符不一样的情况下,有多少种组合
思路:统计一下种类,当种类数大于3的时候,无论无何都不能满足这个情况。
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String[] args) { 5 String str = ""; 6 Scanner cin = new Scanner(System.in); 7 str = cin.next(); 8 int num[] = new int[30]; 9 for(int i = 0;i<str.length();i++) 10 num[str.charAt(i)-'A']++; 11 int k = 0; 12 for(int i = 0;i<26;i++) 13 if(num[i]>0) 14 k++; 15 Long ans = 0L; 16 if(k<=2&&k>=0) 17 ans++; 18 while(k>0){ 19 ans*=k; 20 k--; 21 } 22 System.out.println(ans); 23 } 24 }
题目二:求一个数列是否可以构成等差数列
思路:排序,排序后比较所有差值是否一样即可
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 int num = cin.nextInt(); 8 int arr[] = new int[1005]; 9 for(int i = 0;i<num;i++) 10 arr[i] = cin.nextInt(); 11 Arrays.sort(arr,0,num); 12 int ans = arr[1]-arr[0]; 13 boolean flag = false; 14 for(int i = 1;i<num;i++) 15 if(ans!=arr[i]-arr[i-1]){ 16 flag = true; 17 break; 18 } 19 if(flag) 20 System.out.println("Impossible"); 21 else 22 System.out.println("Possible"); 23 } 24 }
题目三 :求最长的01间隔数列
思路:一维DP,即如果当前两个数字不一样的时候,这个节点的值是上个节点的值加一即可。
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 int num = cin.nextInt(); 8 int arr[] = new int[1005]; 9 for(int i = 0;i<num;i++) 10 arr[i] = cin.nextInt(); 11 Arrays.sort(arr,0,num); 12 int ans = arr[1]-arr[0]; 13 boolean flag = false; 14 for(int i = 1;i<num;i++) 15 if(ans!=arr[i]-arr[i-1]){ 16 flag = true; 17 break; 18 } 19 if(flag) 20 System.out.println("Impossible"); 21 else 22 System.out.println("Possible"); 23 } 24 }
题目四:有两个数列,分别为A、B,在A数列中取N次,第i次取第i个数字插入到B数列里面的最后一个位置,然后将B数列倒置。最后输出B数列
思路:想清楚一个问题,即使每次倒置,但是数字的相对位置还是没有变化,前后的数字没有变化。
1 import javax.xml.bind.SchemaOutputResolver; 2 import java.util.*; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 int ans[] = new int[500000]; 8 int n = cin.nextInt(); 9 int start,end; 10 start = 250000; 11 end = start+1; 12 for(int i = 1;i<=n;i++){ 13 int tmp = cin.nextInt(); 14 if(i%2==0){ 15 ans[end++] = tmp; 16 }else { 17 ans[start--] = tmp; 18 } 19 } 20 21 if(n%2==1){ 22 System.out.printf("%d",ans[++start]); 23 for(int i = start+1;i<end;i++) 24 System.out.printf(" %d",ans[i]); 25 System.out.println(); 26 }else { 27 System.out.printf("%d",ans[--end]); 28 for(int i = end-1;i>start;i--) 29 System.out.printf(" %d",ans[i]); 30 System.out.println(); 31 } 32 } 33 }
题目五:一个人在外面租房子每天要付X元,这个人每天也要吃一个水果,水果每个Y元,但是它最开始有D个水果,然后这个人有P元钱,最多可以生活多少天
思路:不能生活下去的时候,即要么吃不起水果,要么付不起房租。
1 import java.util.*; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner cin = new Scanner(System.in); 6 int x,f,d,p; 7 x = cin.nextInt(); 8 f = cin.nextInt(); 9 d = cin.nextInt(); 10 p = cin.nextInt(); 11 int ans = 0; 12 if(d/x>f){ 13 d -= x*f; 14 ans+=f; 15 ans+=d/(p+x); 16 System.out.println(ans); 17 }else 18 System.out.println((int)d/x); 19 } 20 }
题目六:在一张棋盘上有N个旗子,这个棋盘的每一格可以放无限个棋子,求格子上最少有i个棋子的最少步数(即i个或以上的棋子累积),每个棋子一布为上下左右
思路:每一个最少路的那个点肯定是第i个x,第j个y的值的那个点(i不一定等于j)。
1 import java.util.*; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner cin = new Scanner(System.in); 6 int n = cin.nextInt(); 7 int x[] = new int[100]; 8 int y[] = new int[100]; 9 int dis[][][] = new int[100][100][100]; 10 for(int i = 0;i<n;i++) 11 x[i] = cin.nextInt(); 12 for(int i = 0;i<n;i++) 13 y[i] = cin.nextInt(); 14 for(int i = 0;i<n;i++){ 15 for(int j = 0;j<n;j++){ 16 for(int k = 0;k<n;k++){ 17 dis[i][j][k] = Math.abs(x[i]-x[k])+Math.abs(y[j]-y[k]); 18 } 19 } 20 } 21 int ans[] = new int[100]; 22 for(int i = 0;i<n;i++) 23 for(int j = 0;j<n;j++) 24 Arrays.sort(dis[i][j],0,n); 25 for(int i = 1;i<n;i++){ 26 ans[i] = 1999999999; 27 for(int j = 0;j<n;j++){ 28 for(int k = 0;k<n;k++){ 29 int tmp = 0; 30 for(int z = 0;z<i+1;z++) 31 tmp+=dis[j][k][z]; 32 if(ans[i]>tmp) 33 ans[i] = tmp; 34 } 35 } 36 } 37 System.out.printf("0"); 38 for(int i = 1;i<n;i++) 39 System.out.printf(" %d",ans[i]); 40 System.out.println(); 41 } 42 }
题目七:求一个数列的相邻数字的差值的绝对值的和最大
思路:最大最小间隔着插,最大和最小利用的次数是最多的!!!
1 import java.util.*; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner cin = new Scanner(System.in); 6 int n = cin.nextInt(); 7 int arr[] = new int[500]; 8 for(int i = 0;i<n;i++) 9 arr[i] = cin.nextInt(); 10 Arrays.sort(arr,0,n); 11 int ans = 0; 12 int last = n-1; 13 int first = 0; 14 int max = arr[last--]; 15 int min = arr[first++]; 16 ans += max-min; 17 // System.out.println(ans); 18 while(first<last){ 19 ans+=max-arr[first]; 20 ans+=arr[last]-min; 21 max = arr[last--]; 22 min = arr[first++]; 23 } 24 if(n%2==1) 25 ans+=max-min; 26 System.out.println(ans); 27 } 28 }