https://www.nowcoder.com/test/6291726/summaryjava
題目一:有A-Z的一羣字符,這些字符能夠組合成N個組合,求在保證最多隻有兩個相鄰字符不同的狀況下,有多少種組合spa
思路:統計一下種類,當種類數大於3的時候,不管無何都不能知足這個狀況。code
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 }
題目二:求一個數列是否能夠構成等差數列xml
思路:排序,排序後比較全部差值是否同樣便可blog
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,即若是當前兩個數字不同的時候,這個節點的值是上個節點的值加一便可。ci
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數列get
思路:想清楚一個問題,即便每次倒置,可是數字的相對位置仍是沒有變化,先後的數字沒有變化。io
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元錢,最多能夠生活多少天ast
思路:不能生活下去的時候,即要麼吃不起水果,要麼付不起房租。
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 }