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]