网易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 }

 

posted @ 2018-03-10 21:55  一个_小菜鸟  阅读(440)  评论(0编辑  收藏  举报