网易2018内推笔试编程题

题目1

题目描述

小易觉得高数课太无聊了,决定睡觉。不过他对课上的一些内容挺感兴趣,所以希望老师讲到有趣的地方的时候叫醒他一下。你知道了小易对一堂课每分钟知识点的感兴趣程度,并以分数量化,以及他在这堂课上每分钟是否会睡着,你可以叫醒他一次,这会使得他在接下来的k分钟内保持清醒。你需要选择一种方案最大化小易这堂课听到的知识点分值。

输入描述

第一行n,k, (1 <= n, k <= 105),表示这堂课持续多少分钟,以及叫醒小易一次使他能够保持清醒的时间。
第二行 n个数,a1,a2,…,an(1<=ai<=104),表示小易对每分钟知识点的感兴趣评分。
第三行 n个数,t1,t2,…,tn,表示每分钟小易是否清醒,1表示清醒。

输出描述

小易这堂课听到的知识点的最大兴趣值。

示例

输入

6 3
1 3 5 2 5 4
1 1 0 1 0 0 

输出

16

思路1

  1. 我的思路是统计所有为 1 的 时间的兴趣值,O(N)
  2. 再次遍历,遇到为 0 的时候,统计 之后的 k 个数,并且跳过为 1 个数字不统计
  3. 比较并获得最大值
  4. 这种方法的实质也算是暴力法,更好的方法应该是使用动态规划

代码: AC 90%

import java.util.Scanner;

public class testkeshui {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt(); sc.nextLine();
        int[][] map = new int[n][2];
       String[] str1 = sc.nextLine().split(" ");
       String[] str2 = sc.nextLine().split(" ");
       for (int i=0;i0] = Integer.valueOf(str1[i]);
           map[i][1] = Integer.valueOf(str2[i]);
       }
       int resultMax = 0;
       int curMax = 0;
       int wake = 0; //醒着的时间获得的兴趣值
        for (int i=0;iif (map[i][1] == 1){
                wake += map[i][0];
            }
        }
     for (int i=0;iif (map[i][1] == 0){
                if (map[i][1] == 0){
                    //从 i 开始,往后加上 k 个数
                    curMax = getSum(map,i,k);
                    curMax = curMax+wake;
                }
                resultMax = Math.max(resultMax,curMax);
            }
     }
     resultMax = Math.max(resultMax,curMax);
        System.out.println(resultMax);
    }
    private static int getSum(int[][] map, int i,int k){
        int res = 0; //接下来的 k 包含当前吗?
      for (int j=0;jif (i+jif (map[i+j][1] == 0)
               res += map[i+j][0];
          }
      }
        return res;
    }
}

题目二

题目描述

又到了丰收的季节,恰好小易去牛牛的果园里游玩。 牛牛常说他多整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。 在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。 牛牛觉得问题太简单了,所以希望你来替他回答。

输入描述

第一行 一个数 n (1<= n <= 10^5)
第二行 n个数 ai (1<=ai<=1000),表示从左往右数第i堆有多少苹果
第三行 一个数m (1<= m <= 10^5),表示有m次询问
第四行 m个数qi, 表示小易希望知道第qi个苹果属于哪一堆。

输出描述

m行,第i行输出第qi个苹果属于哪一堆。

示例

输入

5
2 7 3 4 9
3
1 25 11

输出

1
5
3

思路

对苹果数量求累加和,然后运用二分查找即可

  1. 采用 Arrays.binarySearch() 的返回值
import java.util.Arrays;
import java.util.Scanner;

public class fengshou {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] apple = new int[n+1];
        int cur = 0;
        for (int i=1;i<=n;i++){
            cur += sc.nextInt();
            apple[i] = cur;
        }
        int m = sc.nextInt();
        while (m-->0){
            //Arrays.binarySearch() 如果没有查找到值: return -(low + 1);  // key not found.
            //只要拿到 low 的值即可输出
         int index = Arrays.binarySearch(apple,sc.nextInt());
         if (index < 0){
             System.out.println(-index-1);
         }
         else {
             System.out.println(index);
         }

        }
    }
}
  1. 自己实现二分查找
import java.util.Arrays;
import java.util.Scanner;

public class fengshou {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] apple = new int[n+1];
        int cur = 0;
        for (int i=1;i<=n;i++){
            cur += sc.nextInt();
            apple[i] = cur;
        }
        int m = sc.nextInt();
        while (m-->0){
            //Arrays.binarySearch() 如果没有查找到值: return -(low + 1);  // key not found.
            //只要拿到 low 的值即可输出
         //int index = Arrays.binarySearch(apple,sc.nextInt());
         int index = binarySearch(apple,sc.nextInt());
         if (index < 0){
             System.out.println(-index-1);
         }
         else {
             System.out.println(index);
         }

        }
    }

    private static int binarySearch(int[] apple, int k){
        int start = 1; int end = apple.length-1;
        int mid = start - (start-end)/2;
        while (start <= end){
            if (apple[mid]>k){
                end = mid-1;
            }
            else if (apple[mid]1;
            }
            else {
                return mid;
            }
            mid = start - (start-end)/2;
        }
        return start;
    }
}

题目三

题目描述

给你n个a,m个z组成所有可能的字符串,并将字符串按字典序从小到大排列,输出第k个字符串。
若不存在,输出-1。

输入描述

第一行为三个数,分别为a的个数n,z的个数m,第k个字符串。

输出描述

第k个字符串

示例

输入

2 2 6

输出

zzaa

思路

  1. 最开始的思路,将 a 和 z 放到一个 char 数组中,然后执行回溯法,对组合全排列;AC 20%
import java.util.*;

public class test {
    private static TreeSet res = new TreeSet<>();
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {//注意while处理多个case
            int n = in.nextInt();
            int m = in.nextInt();
            int k = in.nextInt();
            char[] s = new char[n+m];
            for (int i=0;i'a';
            }
            for (int i=n;i'z';
            }
            getMax(s,0,n+m-1);
            Iterator itSet = res.iterator();
            while (itSet.hasNext() && k-->0){
                itSet.next();
                if (k==1) System.out.println(itSet.next());
            }
        }
    }
    private static void  getMax(char[] array,int i , int n){
        //全排列,回溯法:递归+循环
        if(i == array.length){//该组合排列完全,可以计算
            res.add(String.valueOf(array));
        }
        else{
            for(int k =i;k<=n;k++){//回溯
                swap(array,k,i);
                getMax(array,i+1,array.length-1);
                swap(array,k,i);
            }
        }
    }

    private static void swap(char[] array,int i, int j){
        char temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
  1. 网上看的,别人采用 DFS 的方式,进行剪枝
package Interview.wangyi.wangyi_0811;

import java.util.ArrayList;
import java.util.Scanner;

public class zifuchuan {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int k = in.nextInt();
        ArrayList list = new ArrayList<>();
        //深度优先存储所有字符串,然后取出第k个字符串
        dfs(n,m,list,"");
        if (list.size()1);
        }
        else {
            System.out.println(list.get(k-1)); //从0开始
        }
    }

    //此处DFS ,对它进行了剪枝,循环次数大大减少,但是依然不适合数据量大的时候
    private static void dfs(int n , int m , ArrayList list,String s){
        if (m==0 && n==0){
            list.add(s);
        }
        else {
            if (n>0){
               dfs(n-1,m,list,s+'a');
            }
            if (m>0){
                dfs(n,m-1,list,s+'z');
            }
        }
    }
}
  1. 动态规划
import java.util.Scanner;

public class zifuchuan2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int k = in.nextInt();
        //构建dp数组,计算每种选择下的组合而成的字符串个数
        int[][] dp = new int[n+1][m+1];
        //假设dp[i][j]表示i个a和j个z的方案数,根据上面这个公式列表计算我们可以发现:d[i][j] = dp[i-1][j] + dp[i][j-1];
        dp[0][0] = 1;
        for (int i=0;i<=n;i++){
            dp[i][0] = 1;
        }
        for (int j=0;j<=m;j++){
            dp[0][j] = 1;
        }
        for (int i=1;i<=n;i++){
            for (int j=1;j<=m;j++){
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        StringBuilder sb = new StringBuilder();

        //假设我们现在考虑输出字符串的第i个字符,如果当前选了a字符
        //假设后面剩余字符a和z的个数是m1,n1,那么后面所能组成的字符串总数为dp[m1][n1]
        //如果k小于dp[m1][n1],那么我们就能选a,因为后面组成的数目大于k,我们要选字符a来缩小这个组合数
        //否则,就选z,这时k -= dp[m1][n1],这是因为要减去a形成的方案数
            if (k>dp[n][m]){
                System.out.println(-1);
            }
            else {//计算出 第 k 个字符
                int n1 = n;
                int m1 = m;
                for (int i=0;i//字符串长度
                    if (n1>0 && k<=dp[n1-1][m1]){//可以添加 a 到字符串中
                        sb.append("a");
                        n1--;
                    }
                    else {
                        if (n1>0){//减去形成 a 形成的方案数
                            k -= dp[n1-1][m1];
                        }
                        sb.append("z");
                        m1--;
                    }
            }
        }
        System.out.println(sb.toString());
    }
}

你可能感兴趣的:(校招笔试)