java笔试面试小题(3)

java笔试面试小题

【来源:牛客网




1、【 拼多多2020校招编程题–多多的魔术盒子】多多鸡有N个魔术盒子(编号1~N),其中编号为i的盒子里有i个球。
多多鸡让皮皮虾每次选择一个数字X(1 <= X <= N),多多鸡就会把球数量大于等于X个的盒子里的球减少X个。
通过观察,皮皮虾已经掌握了其中的奥秘,并且发现只要通过一定的操作顺序,可以用最少的次数将所有盒子里的球变没。
那么请问聪明的你,是否已经知道了应该如何操作呢?

输入描述:
第一行,有1个整数T,表示测试用例的组数。
(1 <= T <= 100)
接下来T行,每行1个整数N,表示有N个魔术盒子。
(1 <= N <= 1,000,000,000)
输出描述:
共T行,每行1个整数,表示要将所有盒子的球变没,最少需要进行多少次操作。
输入例子1:
3
1
2
5
输出例子1:
1
2
3

解析:

要用最少的次数把所有盒子减到0,第一次必然是减少中间盒子的球数
比如 1,2,3,4,5, 第一次减3 得到1,2,0,1,2 ,这时我们可以看到左右两边相等的

解答:

import java.util.Scanner;
 
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        for (int i = 0;i<num;i++){
    
    
            int n = sc.nextInt();
            System.out.println(cal(n));
        }
 
    }
 
    public static int cal(int n){
    
    
        if (n==1) return 1;
        if (n==2) return 2;
        else return 1+cal(n/2);
    }
 
 
}

2、【拼多多2020校招编程题–多多的电子字典】多多鸡打算造一本自己的电子字典,里面的所有单词都只由a和b组成。
每个单词的组成里a的数量不能超过N个且b的数量不能超过M个。
多多鸡的幸运数字是K,它打算把所有满足条件的单词里的字典序第K小的单词找出来,作为字典的封面。

输入描述:
共一行,三个整数N, M, K。(0 < N, M < 50, 0 < K < 1,000,000,000,000,000)
输出描述:
共一行,为字典序第K小的单词。
输入例子1:
2 1 4
输出例子1:
ab
例子说明1:
满足条件的单词里,按照字典序从小到大排列的结果是
a
aa
aab
ab
aba
b
ba
baa

解析:

dp[n][m]表示n个a,m个b的单词数量
dp[n][m] = 1 + dp[n-1][m] + 1 + dp[n][m-1]
根据K倒推,是前半部分,还是后半部分,来确定第一个字母是 a,还是b
注意dp[n][m] 可能超过long类型的范围,所以,用BigInteger来存dp

解答:

import java.util.*;
import java.math.*;
public class Main{
    
    
    public static void main(String[] args){
    
    
        BigInteger[][] dp = new BigInteger[50][50];
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        long K = sc.nextLong();
        for(int i=0;i<=N;i++){
    
    
            dp[i][0] = new BigInteger(Integer.toString(i));
        }
        for(int i=0;i<=M;i++){
    
    
            dp[0][i] = new BigInteger(Integer.toString(i));
        }
        for(int i=1;i<=N;i++){
    
    
            for(int j=1;j<=M;j++){
    
    
                //dp[i][j] = 1+dp[i-1][j] + 1+ dp[i][j-1];
                dp[i][j] = dp[i-1][j].add(dp[i][j-1]).add(new BigInteger("2"));
            }
        }
        StringBuilder sb = new StringBuilder();
        int n = N, m = M;
        long k = K;
        while(k>0){
    
    
            if(n>0 && m>0){
    
    
                if(dp[n-1][m].compareTo(new BigInteger(Long.toString(k-1)))>=0){
    
    //k<=dp[n-1][m]+1
                    k--;
                    sb.append('a');
                    n--;
                }else{
    
     //k>dp[n-1][m]+1
                    k -= dp[n-1][m].longValue()+2;
                    sb.append('b');
                    m--;
                }
            }else if(n>0 && m==0){
    
    
                k--;
                sb.append('a');
                n--;
            }else if(n==0 && m>0){
    
    
                k--;
                sb.append('b');
                m--;
            }else{
    
    
                k=0;
            }
        }
        System.out.println(sb.toString());
    }
}

3、【拼多多2020校招编程题–二维表第k大数】在一块长为n,宽为m的场地上,有n✖️m个1✖️1的单元格。每个单元格上的数字就是按照从1到n和1到m中的数的乘积。具体如下

n = 3, m = 3
1 2 3
2 4 6
3 6 9

给出一个查询的值k,求出按照这个方式列举的的数中第k大的值v。
例如上面的例子里,
从大到小为(9, 6, 6, 4, 3, 3, 2, 2, 1)
k = 1, v = 9
k = 2, v = 6
k = 3, v = 6
...
k = 8, v = 2
k = 9, v = 1

解答:

import java.util.Scanner;

public class Main{
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int M = in.nextInt();
        int K = in.nextInt();
        int l = 0;
        int h = M * N;
        //反向序号
        K = M * N - K + 1;
        while (l <= h) {
    
    
            int mid = l + (h - l) / 2;
            // 假定以mid作为最大数的所在行curRow; 由矩阵的特点可知:
            // curRow的上一行所有的数都将小于mid,缩小查找范围
            int curRow = mid / M;
            // 同理,获取所在列curCol;
            int curCol = mid / N;
            int cnt = curRow * M + curCol * (N - curRow);
            // 剩下右下角一个小矩形
            for (int i = curRow + 1; i <= N; i++) {
    
    
                for (int j = curCol + 1; j <= M && (i * j <= mid); j++) {
    
    
                    cnt++;
                }
            }
            if (cnt >= K) {
    
    
                h = mid - 1;
            } else {
    
    
                l = mid + 1;
            }
        }
        System.out.println(l);
    }
}

4、【格力2020秋招后端岗笔试题】下面关于系统调用的描述中,错误的是(B)

  • A、系统调用把应用程序的请求传输给系统内核执行
  • B、系统调用中被调用的过程运行在”用户态”中
  • C、利用系统调用能够得到操作系统提供的多种服务
  • D、是操作系统提供给编程人员的接口
解析:
系统调用中被调用的过程运行在“管态”中,被用户调用才是“用户态(目态)”,由系统调度的一般都是“管态”

5、【格力2020秋招后端岗笔试题】下列关于B/S架构软件与C/S架构软件的区别描述错误的是?(D

  • A、 B/S属于C/S,浏览器只是特殊的客户端;
  • B、 C/S可以使用任何通信协议,而B/S这个特殊的C/S架构规定必须实现HTTP协议;
  • C、 C/S架构的劣势还有高昂的维护成本且投资大
  • D、 C/S架构维护和升级方式简单

6、【格力2020秋招后端岗笔试题】哪个是正确的(C

class Test{
    
            
     private int m;
         public static void fun() {
    
    
         // some code...
    }
}
  • A、将private int m 改为protected int m
  • B、将private int m 改为 public int m
  • C、将private int m 改为 static int m
  • D、将private int m 改为 int m

7、【格力2020秋招后端岗笔试题】现有一个整型数组a [4],它的所有元素是(B

  • A、a0.a1,a2.a3
  • B、a[0],a[1],a[2],a[3]
  • C、a [1],a [2],a[2],a[4]
  • D、a [0],a[1],a [2],a[3],a[4]

猜你喜欢

转载自blog.csdn.net/qq_41209886/article/details/108807711