• 网易秋招内推编程题题解


      第一次全做对惹,悄悄的骄傲一下下然后夹紧尾巴告诉自己是个弱鸡QAQ。

    1.暴力

      题目不记得了,大致意思就是给两个数组,一个数组a【i】表示在第i时刻能获得的知识,另一个数组b【i】只含1、0,1表示小明(名字是小明咩?)醒着,0表示他没醒,你有一次叫醒他的机会,可以叫醒k分钟,问他能得到的最多的知识是多少。emmm做了题的应该知道是哪一题吧,当时也没想太多,反正是暴力解,就不多说啦。

     1     public static void main(String[] args) {
     2         Scanner in = new Scanner(System.in);
     3         while (in.hasNextInt()) {//注意while处理多个case
     4             int n = in.nextInt();
     5             int k = in.nextInt();//叫醒的时间长度
     6             int[] nums = new int[n];
     7             int[] alive = new int[n];//记录是否醒着的数组
     8             int res = 0;
     9             for(int i = 0;i<n;i++){
    10                 nums[i] = in.nextInt();
    11             }
    12             for(int i = 0;i<n;i++){
    13                 alive[i] = in.nextInt();
    14             }
    15             for(int i = 0;i<n;i++){
    16                 if(alive[i] == 1){
    17                     res += nums[i];
    18                 }
    19             }
    20             int sum = 0,maxx = 0;//sum记录第i时刻叫醒能“多”获得的知识
    21             for(int i = 0;i<n-k+1;i++){
    22                 sum = 0;
    23                 for(int j = 0;j<k;j++){
    24                     if(alive[i+j] == 0){
    25                         sum += nums[i+j];
    26                     }
    27                 }
    28                 maxx = Math.max(sum,maxx);
    29             }
    30             System.out.println(res+maxx);
    31         }
    32     }

      代码有点乱,不过主要是为了做题,先ac了再去考虑别的啦。

    2.苹果园(二分)

      大意是给一个数组每个数表示第i堆苹果有几个,再给一个数k,问从左往右(从a【0】-a【n】)第k个苹果是哪一堆的。

      用数组b【i】记录从a【0】-a【i】有多少个苹果,找到一个结果m,满足b【m】<k 且b【m+1】>k即可。二分查找,不然可能会超时。(看数据量猜的)。

      交完卷,看到牛客讨论区说可以用红黑树,我才想到有treemap这种东西可以直接用,就不需要每次都写二分了,每次考虑边界都要卡好久QAQ。

     1     public static void main(String[] args) {
     2         Scanner in = new Scanner(System.in);
     3         while (in.hasNextInt()) {//注意while处理多个case
     4             int n = in.nextInt();
     5             int[] nums = new int[n];
     6             int last = 0;
     7             for(int i = 0;i<n;i++){
     8                 nums[i] = last+in.nextInt();
     9                 last = nums[i];
    10             }
    11             int m = in.nextInt();
    12             for(int i = 0;i<m;i++){
    13                 int qi = in.nextInt();
    14                 System.out.println(binarySearch(qi, nums)+1);
    15             }
    16         }
    17     }
    18     static int binarySearch(int n,int[] nums){//二分找
    19         int l = 0;
    20         int r = nums.length;
    21         int mid = (l+r)/2;
    22         while(l<r){
    23             mid = (l+r)/2;
    24             if(mid == 0){
    25                 return mid;
    26             }
    27             if(nums[mid-1] < n && nums[mid] >= n){
    28                 return mid;
    29             }else if(nums[mid] < n){
    30                 l = mid+1;
    31             }else {
    32                 r = mid;
    33             }
    34         }
    35         return l;
    36     }

    3.字符串字典序

      给n个'a'字符和m个‘z’字符,用全部字符组合成的字典序第k个(k为1就是最小的)的字符串是什么,比如2'a' 2'z' 第6个字典序为zzaa,如果不存在就输出-1。

      看到题目感觉暴力肯定跑不完,就开始找规律,想找到一些规律,一开始思考是不是有z字符在第几位就可以加多少的规律,比如z在第一位就像二进制一样可以加1类似的规律,然后发现似乎没有;于是改变思路,突然发现自己写的代码一开始用到了计算n个a与m个z能组成的最多字符串数量,比较k,如果比k大,就存在,如果比k小,就输出-1,这个点提醒了我,可以试图把a放到最高位,然后计算n-1个a和m个z能组成的最多字符串数量,如果比k大,最高位就是z,如果比k小,最高位就是a,然后递归(当最高位是z时,要把k减去最高位为a时的数量)。突然醒悟!然后就ac啦!!(当然由于int会溢出,计算字符串总量时,ac前把max改成double就突然过了嘻嘻)

      上代码:

     1 public static void main(String[] args) {
     2         Scanner in = new Scanner(System.in);
     3         while (in.hasNextInt()) {//注意while处理多个case
     4             int n = in.nextInt();//a
     5             int m = in.nextInt();//z
     6             int k = in.nextInt();
     7             double max = getMax(n, m);//计算最多的字符串数量
     8             if(k>max){
     9                 System.out.println(-1);
    10             }else {
    11                 helper(n,m,k);
    12                 System.out.println();
    13             }
    14         }
    15     }
    16     static void helper(int n,int m,int k){
    17         if(n == 0 && m == 0){
    18             return;
    19         }
    20         if(n == 0){//a个数为0时,就把z全输出
    21             for(int i = 0;i<m;i++){
    22                 System.out.print("z");
    23             }
    24             return;
    25         }else if (m == 0) {
    26             for(int i = 0;i<n;i++){
    27                 System.out.print("a");
    28             }
    29             return;
    30         }
    31         double max = getMax(n-1, m);
    32         if(max>=k){//如果比k大,就放a
    33             System.out.print("a");
    34             helper(n-1, m, k);
    35         }else {//如果比k小,就放z
    36             System.out.print("z");
    37             helper(n, m-1, (int)Math.round(k-max));
    38         }
    39     }
    40     
    41     static double getMax(int n,int m){//计算n个a与m个z组成的字符串总量
    42         double max = 1;
    43         for(int i = 0;i<n;i++){
    44             max *= (m+n-i);
    45         }
    46         for(int i = 0;i<n;i++){
    47             max /= i+1;
    48         }
    49         return max;
    50     }

      emm,第一次ak,感觉运气很好,第三题恰好能发现那个规律(递归),不说了,滚去复习了(来自还没和面试官说过一句话的弱鸡)。

  • 相关阅读:
    win10的power shell可以学习少部分linux命令_功能与cmd类似
    js数组的初始化
    Vue.js 学习笔记
    jquery knob旋钮插件
    jquery 城市三级联动
    xampp 配置虚拟主机
    2016 360 前端开发 面经
    2016 乐视 前端开发 面经
    主流浏览器内核及前缀
    前端代码优化方法
  • 原文地址:https://www.cnblogs.com/zzzdp/p/9460475.html
Copyright © 2020-2023  润新知