zoukankan      html  css  js  c++  java
  • 网易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 }

  • 相关阅读:
    Sea Battle<海战>(思路题)
    Hat's Fibonacci hdu 1250
    Nearest Neighbor Search
    Divisible by Seven CodeForces
    手机自动化测试:appium源码分析之bootstrap六
    手机自动化测试:appium源码分析之bootstrap五
    手机自动化测试:appium源码分析之bootstrap四
    手机自动化测试:appium源码分析之bootstrap三
    手机自动化测试:appium源码分析之bootstrap二
    手机自动化测试:appium源码分析之bootstrap一
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/8542278.html
Copyright © 2011-2022 走看看