刷题录-哔哩哔哩2020校园招聘Android方向笔试卷(一)

193 阅读9分钟

单选题

1.在一棵二叉树上,第5层最多拥有多少个结点?

2^(i-1)

2.对于以下二叉树,哪个是不可能遍历出的结果?

image.png

42513 中序遍历 √

12453 前序遍历 √

45213 该答案错误

13254 优先遍历右子树 √

3.12345五个数字入栈的顺序一定是从前往后的,出栈的时机不确定,以下哪个是不可能的出栈顺序?

54321 √

43512 该顺序不可能得到

43251 √

12345 √

4.n层的二叉树,最少拥有多少个结点?

n个

5.就平均性能而言,下列排序算法中哪种排序最快?

希尔 -> 最优O(n) 最差O((nlogn)^2) 平均O((nlogn)^2) ×

冒泡 -> 最优O(n) 最差O(n^2) 平均O(n^2) ×

交换 -> 交换排序包含冒泡排序、快速排序 ×

快速 -> 最优O(nlogn) 最差O(n^2) 平均O(nlogn) √

希尔排序是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序,是一种非稳定排序算法,它将待排序的数组元素按下标的一定增量分组,分成多个子序列,然后对各个子序列进行直接插入排序算法,然后依次缩减增量再进行排序,直到增量为1时,进行最后依次直接插入排序,排序结束

//冒泡排序原始版
public void bubbleSort ( int[] array){
    for (int i = 0; i < data.length - 1; i++) {  //比较n-1趟
        for (int j = 0; j < data.length - 1 - i; j++) {
            if (data[j] > data[j + 1]) {
                int temp = data[j + 1];
                data[j + 1] = data[j];
                data[j] = temp;
            }
        }
    }
}
//快速排序
public void quickSort(int[] arr, int left, int right) {
    if (left > right) return;
    if (arr == null || arr.length == 0) return;

    int base = arr[left];  //基准数
    int i = left;
    int j = right;
    while (i != j) {  //从两边向中心,不相遇时
        //先从右向左
        while (arr[j] >= base && i < j) {
            j--;    //从右向左,大于等于基准值继续遍历
        }
        while (arr[i] <= base && i < j) {
            i++;   //当arr[j]小于基准值时,从左向右,小于基准值继续遍历
        }
        //右边小于基准值,左边大于基准值,进行交换,保证左边的比基准值小,右边比基准值大
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    //当i与j相遇时,将基准数与相遇位置交换
    arr[left] = arr[i];
    arr[i] = base;
    //然后对基准数左右两边的分别排序
    quickSort(arr, left, i - 1);
    quickSort(arr, i + 1, right);
}

6.表序列为 (b c d e f g q r s), 则在二分法查找关键字b的过程中,先后进行比较的关键字依次是

如题,可得数组为奇数,首先我们找到中间值 f ,因为 f > b,所以将f右边的全部排除,其实这里出现了一个问题,就是我们要不要把f也算入下一次二分,如果我们算入的话,则下次找到的中间值为 d,d > b,将右边的排除,继续将d算入,找到c,将右边的排除,最终找到b,比较的关键字则是 f d c b;若刚刚我们不把中间值算入下一次的话,则得到 f c b,个人感觉应该是不将中间值算入下一轮二分,所以正确答案是 f c b

7.以下哪种语言移植性最好?

机器语言

汇编语言

高级语言 √

自然语言

8.下面给出的Java中ClassLoader中的描述,哪些是描述正确的?

ClassLoader没有层次关系 × -> 它拥有上下级的层次关系(但不是继承)

所有类中的ClassLoader都是AppClassLoader × -> 有系统类加载器、扩展类加载器、应用程序加载器、自定义加载器

通过Class.forName(StringclassName),能够动态加载一个类 √

不同的ClassLoader加载同一个Class文件,所得的类是相同的 × -> JVM在判断两个类是否相同时,除了比较类名之外,还需要比较类加载器是否是同一个实例

9.下列程序的输出结果是多少?

public class Test {
  static int x, y;
  static {
    int x = 1;
    int y = 2; 
    }
    
    public static void main (String[] args) {
      x--;
      myMethod();
      System.out.println (x + y++ + x);
      }
    public static void myMethod () {
      y = x++ + ++x;
      }
    }

我们需要知道已经定义过静态变量x,y之后,再在静态代码块中定义x,y是无效的,则x,y默认为0,i++是先赋值,后增加,++i是先增加,后赋值,所以最后输出2

10.以下能得到正确值的方法的是?

Short s1 = 99S;

float f = 1.0;

int tt = 018;

int t = "123".length(); √

11.以下代码输出结果是?

public class Test {
    public static void main(String[] args) {
        String str = "ABCDEFGHI";
        String str1 = str.substring(3, 5);
        System.out.println(str1);
    }
}

public String subString(int beginIndex,int endIndex),其中 beginIndex是起始索引(包含),索引从0开始,endIndex是结束索引(不包含)

12.请问以下方法的时间复杂度是多少?

int n = 10;
for (i = 1; i < n; ++i) {
    for (j = 1; j < n; j += n / 2) {
        for (k = 1; k < n; k = 2 * k) {
            x = x + 1;
        }
    }
}

nlogn

13.以下哪条SQL语句可以删除数据库中的表table?

DROP TABLE table √ -> DELETE用于删除表中的行,DROP用于删除表,TRUNCATE用于删除表中的数据

14.以下关于操作系统说法错误的是?

操作系统提供了编程接口和命令接口

系统调用是通过中断来实现的,当发生系统调用,处理器会从用户态变为内核态

微内核操作系统提供消息机制,比整体内核执行效率高 × 该项错误

操作系统不关心高级语言的编译器实现

15.IPv4的地址长度是多少位?

32位

16.目前的主流PC设备上,对500万个随机整数数组进行排序,需要花费的CPU时间量级是?

1秒

17.C 语言中,在语句 if (/* condition */) 的条件表达式中,下列条件会被当作真的是?

(int)0

(int)-1 √ C语言中,只有0为假,非0都为真

*(const char *)" "

(void *)NULL

18.C 语言中,对于 8 位有符号整数类型 int8_t,其有效取值范围是?

[-128,127]

19.C 语言中,对于多位数组 int a[2][3],下列表达式中,与 a[1][2] 等价的是?

*(a[1] +2 )

20.C 语言中,对于无符号整数 n,下列表达式不能用来确定 n 为偶数的是?

n % 2 == 0

n & 0x1 == 0 -> 0x1表示16进制中的1 &表示按位与,效果等于取二进制最右边的数字

n | 0x1 == n 该项不能确定

n / 2 * 2 == n

21.C 语言中,声明语句 int (*pf)(); 定义了什么?

定义了一个指向返回值类型为 int 的函数的函数指针

22.C 语言中,下面程序的输出结果为?

#include <stdio.h>
char *get_slogan() {
  char str[512];
  strcpy(str, "bilibili cheers");
  return str;
}
int main() {
  printf("%s", get_slogan());
  return 0;
}

程序不会崩溃,并且会输出 bilibili cheers

程序不会崩溃,但也不会输出任何字符

程序可能输出任意字符串,也可能崩溃 √

程序一定会崩溃

23.C 语言中,下面程序的输出结果为?

#include <stdio.h>
int fib(int n) {
  if (n == 0 || n == 1) return 1;
  return fib(n - 1) + fib(n - 2);
}
int main() {
  printf("%d", fib(8));
  return 0;
}

34

24.C++语言中,下列说法错误的是?

不应在类的构造函数中若抛出异常(防止产生未完全构造的对象),构造函数中任何未捕获的异常均会终结程序 -> 该说法错误,构造函数中抛出异常将导致对象的析构函数不被执行

如果需要自定义类的析构函数来管理资源,我们往往也需要自定义该类的复制构造函数以及赋值运算符

不建议在构造函数和析构函数中调用虚函数,因为此时对象可能不完整,无法多态地调用原本类型中定义的虚函数

即使一个用户自定义类型 T,未定义任何成员 class T {},为了保证能获得实例的内存地址 sizeof(T) 也不会为 0

25.C++ 语言中,对于自定义类 T,可以使用 STL 容器 std::set<T> 的前提是?

自定义类型 T 必须存在无参数的构造函数

自定义类型 T 是平凡的,可二进制直接复制的 (POD 类型)

自定义类型 T 之间的大小关系有良定义 (如重载了 < 运算符) √

自定义类型 T 的哈希值有良定义 (定义了 std::hash<T>)

C++ 语言中,下面程序的输出结果为?

#include <iostream>
struct B {
  virtual int foo() { return 0; }
  int bar() { return 0; }
};
struct D : B {
  int foo() override { return 1; }
  int bar() { return 1; }
};
int main() {
  int result = 0;
  B obj1 = D();
  D obj2 = D();
  B *obj3 = &obj2;
  B &obj4 = obj2;
  result += obj1.foo() + obj1.bar();
  result += obj3->foo() + obj3->bar();
  result += obj4.foo() + obj4.bar();
  
  std::cout << result << std::endl;
  return 0;
}

2

27.定义3个变量double a ; unsigned int b ; long c ; 则表达式a + b + c的值的类型是?

double

image.png

28.默认的class成员的访问级别是?

private 看清题意是指类成员的访问级别!

29.exception是?

运行时错误

常见的编译时异常 1.FileNotFoundException

2.ClassNotFoundException

3.SQLException

4.NoSuchFieldException

5.NoSuchMethodException

6.ParseException

常见的运行时异常 1.NullPointerException

2.ArithmeticException

3.ClassCastException

4.ArrayIndexOutOfBoundsException

5.StringIndexOutOfBoundsException

30.以下程序的输出结果是

#include<stdio.h>
void main() {
  int i;
  float a = 5.2;
  char *ptr;
  ptr = (char *)&a;
  for (i = 0; i <= 3; i++)
    printf(“%d “, *ptr++);
}

暂未看懂这个题

编程题

题目一:最小子串

题目描述

给定字串A和字符集B,求在A中包含了B所有字符的最小子串

输入描述

输入一行字串(不会为空)
ABAKJSDYUIWNQJNDSAHDBALSDH
输入一个字符集(不会为空,也不会出现重复字符)
ABD

输出描述

输出包含了字符集所有字符的第一个最小子串,例如上面的输入对应输出DBA
如果没有符合条件的子串,则输出#

示例1

输入

ABAKJSDYUIWNQJNDSAHDBALSDH
ABD

输出

DBA

问题解答

暂未想到较好的方法处理

题目二:大数乘法

题目描述

大数指超过int64_t可承载范围的数字

输入描述

输入两行数n1, n2 (0 < n* < 2^100)

输出描述

输出两数之积

示例1 输入

2
3

输出

6

示例2 输入

9223372024429430685
34223371424429430685

输出

315654886577740006976078312593219569225

问题解答

可以借助于java中BigInteger来得到两个大数的乘积

public class Solution {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        BigInteger num1 = new BigInteger(scan.nextLine());
        BigInteger num2 = new BigInteger(scan.nextLine());
        BigInteger res = num1.multiply(num2);
        System.out.println(res);
    }
}

题目三:验证字符串

题目描述

给定一个字符串 S,如果 S 满足以下要求中的任意一个则返回 true,否则返回 false:

  1. 全部都是大写字母,比如 "BILIBILI"
  2. 全部都是小写字母,比如 "bilibili"
  3. 首字母大写,比如 "Bilibili"

输入描述

输入为字符串,且只包含英文字母。

输出描述

输出为 true 否则 false

示例1

输入

bilibili

输出

true

示例2

输入

BiliBili

输出

false

问题解答

可以首先判断字符串的首位是否为大写,若不为大写,则条件3置为false,之后再依次遍历, 若为大写的话,则全为小写的条件不满足,将条件2置为false,若为小写的话,则全为大写的条件不满足,将条件1置为false。

public class Solution3 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String data = scan.nextLine();
        Boolean flag1 = true;   //全大写
        Boolean flag2 = true;   //全小写
        Boolean flag3 = true;   //首字母大写
        if (data.charAt(0) < 'A' || data.charAt(0) > 'Z') {
            flag3 = false;
        }
        for (int i = 0; i < data.length(); i++) {
            char c = data.charAt(i);
            if (c < 'A' || c > 'Z') {   //小写时
                flag1 = false;  //将无法全大写
            } else {  //大写时
                flag2 = false;  //将无法全小写
                if (i > 0) flag3 = false;  //除首字母大写外,如果其他也大写,则不满足条件三
            }
            if (!(flag1 || flag2 || flag3)) {
                System.out.println(false);
                return;
            }
        }
        System.out.println(true);
    }
}