唯品会笔试题目

编程题

字符串加法

输入两个字符串a和b,字符串内容为二进制数字,求两个字符串相加的结果,加法计算方法以二进制方式计算,并返回对应的字符串结果。要求程序尽可能的高效

import java.util.Scanner;
public class Main{
    
    
    public static String add(String a, String b){
    
    
        int m = a.length() - 1, n = b.length() - 1;
        StringBuilder res = new StringBuilder("");
        int flag = 0;
        while (m >= 0 || n >= 0 || flag != 0){
    
    
            int x = 0, y = 0;
            if (m >= 0){
    
    
                x = a.charAt(m--) - '0';
            }
            if (n >= 0){
    
    
                y = b.charAt(n--) - '0';
            }
            int val = (x + y + flag) % 2;
            flag = (x + y + flag) > 1 ? 1 : 0;
            res.append(val);
        }
        return res.reverse().toString();
    }

    public static void main(String []args){
    
    
        Scanner sc = new Scanner(System.in);
        String []arrs = sc.nextLine().split(" ");
        System.out.println(add(arrs[0], arrs[1]));
    }
}

有序矩阵中第K小的元素

给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。
示例:

matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,

返回 13。
说明:
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main{
    
    
    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt(),n = sc.nextInt();
        int data[][] = new int[n][n];
        for (int i = 0; i < n; i++) {
    
    
            for (int j = 0; j < n; j++) {
    
    
                data[i][j] = sc.nextInt();
            }
        }
        System.out.println(findKthNum(data, k));
        //System.out.println(findKthNum1(data, k));
    }
    //方法1,二分套二分,时间复杂度O(n*logn*logn)
    public static int findKthNum(int[][] matrix, int k) {
    
    
        int row = matrix.length;
        int col = matrix[0].length;
        int low = matrix[0][0];
        int high = matrix[row - 1][col - 1];
        int mid = 0;
        int count = 0;
        while (low <= high) {
    
    
            count = 0;
            mid = low + ((high - low) >> 1);
            for (int[] item : matrix) {
    
    
                count += binarySearchCount(item, mid);
            }
            if (count < k) {
    
    
                low = mid + 1;
            } else {
    
    
                high = mid - 1;
            }
        }
        //返回的low表示满足count >= k的最小的数,这个数就是要找的第k个数
        return low;
    }

    public static int binarySearchCount(int[] data, int k) {
    
    
        int begin = 0, end = data.length - 1;
        int mid = 0;
        while (begin <= end) {
    
    
            mid = begin + ((end - begin) >> 1);
            if (data[mid] <= k) {
    
     //这里要加上等于k的
                begin = mid + 1;
            } else {
    
    
                end = mid - 1;
            }
        }
        //全大于、全小于k都是begin,正好对应上了
        //这里返回的begin表示<=k的数的个数
        return begin;
    }

    //方法2,快排思想,把二维压成1维,用partion来找第k大的数,复杂度O(n^2),对比还是第一种方法复杂度低一些
    //但是如果用排序了,对n^2的数据排序复杂度最小为O(n^2*log(n^2))
    public static int findKthNum1(int[][] matrix, int k) {
    
    
        int row = matrix.length;
        int col = matrix[0].length;
        int[] arr = new int[row * col];
        for (int i = 0; i < row; i++) {
    
    
            for (int j = 0; j < col; j++) {
    
    
                arr[i * col + j] = matrix[i][j];
            }
        }
        int begin = 0, end = arr.length - 1;
        int pos;
        while (begin <= end) {
    
    
            pos = partition(arr, begin, end);
            if (pos == k - 1) {
    
    
                return arr[pos];
            } else if (pos > k - 1) {
    
    
                end = pos - 1;
            } else {
    
    
                begin = pos + 1;
            }
        }
        return 0;
    }

    public static int partition(int[] arr, int begin, int end) {
    
    
        int temp = arr[begin];
        while (begin < end) {
    
    
            while (begin < end && arr[end] >= temp) {
    
    
                end--;
            }
            swap(arr,begin,end);
            while (begin < end && arr[begin] < temp) {
    
    
                begin++;
            }
            swap(arr,begin,end);
        }
        return begin;
    }
    public static void swap(int[]arr,int i,int j){
    
    
        if (arr == null || i >= arr.length || j >= arr.length || i < 0 || j < 0) {
    
    
            return;
        }
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

单选

1.引入多道程序的目的在于()
A.充分利用CPU,减少CPU等待时间
B.提高实时响应速度
C.有利于代码共享,减少主、辅存信息交换量
D.充分利用存储器
答案:A
解析:
多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下,相互穿插运行,两个或两个以上程序在计算机系统中同处于开始到结束之间的状态, 这些程序共享计算机系统资源。与之相对应的是单道程序,即在计算机内存中只允许一个的程序运行。
即:提高CPU的利用率。在多道程序环境下,多个程序共享计算机资源当某个程序等待I/O操作时,CPU可以执行其他程序,大大提高CPU的利用率。

2.系统出现死锁的原因是()
A.计算机系统发生了重大故障
B.有多个封锁的进程同时存在
C.若干进程因竞争资源而无休止的等待着,它未释放已占有的资源
D.资源数大大少于进程数,或进程同时申请的资源数大大超过资源总数
答案:C

3.所谓LRU页面置换算法,是指()
A.将驻留在主存中的页面随便挑选一页淘汰
B.将驻留在主存中的时间最长的一页淘汰
C.将驻留在主存中近期最少使用的页面淘汰
D.将驻留在主存中的最不常用的页淘汰
答案:C
解析:
LRU是Least Recently Used的缩写

4.与10.110.12.29 mask 255.255.255.224 属于同一网段的主机IP地址是 ()
A.10.110.12.0
B.10.110.12.30
C.10.110.12.31
D.10.110.12.32
答案:B
解析:
ip与掩码相与得网络号,相等即在同一网段
0是网关
31 是广播地址,子网掩码取反和ip进行或操作
32 是不同网段

5.在C++语言中,对函数参数默认值描述正确的是()
A.函数参数的默认值只能设定一个
B.一个函数的参数若有多个,则参数默认值的设定可以不连续
C.函数参数必须设定默认值
D.在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值
答案:D

6.下列关于构造函数的描述中,错误的是()
A.构造函数可以设置默认参数
B.构造函数在声明对象时自动执行
C.构造函数可以对静态数据成员进行初始化
D.构造函数可以重载
答案:C
解析:
静态成员不属于某个对象,而是属于类本身。
可以在构造函数中使用或者修改静态成员的值,但不能初始化它

7.循环语句whlie(int i=0 )i–;的循环次数是()
A.0
B.1
C.5
D.无限次
答案:A
解析:
int i=0,所以while的运行条件是0,0是false,所以不运行。

8.下列关于链接描述,错误的是()

A.硬链接就是让链接文件的i节点号指向被链接文件的i节点
B.硬链接和符号连接都是产生一个新的i节点
C.链接分为硬链接和符号链接
D.硬连接不能链接目录文件
答案:B
解析:
1、定义不同
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
硬链接就是一个文件的一个或多个文件名。把文件名和计算机文件系统使用的节点号链接起来。因此我们可以用多个文件名与同一个文件进行链接,这些文件名可以在同一目录或不同目录。

2、限制不同
硬链接只能对已存在的文件进行创建,不能交叉文件系统进行硬链接的创建;
软链接可对不存在的文件或目录创建软链接;可交叉文件系统;

3、创建方式不同
硬链接不能对目录进行创建,只可对文件创建;
软链接可对文件或目录创建;

4、影响不同
删除一个硬链接文件并不影响其他有相同 inode 号的文件。
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。

硬连接不管有多少个,都指向的是同一个I节点,会把结点连接数增加,只要结点的连接数不是0,文件就一直存在不管你删除的是源文件还是连接的文件。只要有一个存在文件就存在。
当你修改源文件或者连接文件任何一个的时候,其他的文件都会做同步的修改。软链接不直接使用i节点号作为文件指针,而是使用文件路径名作为指针。所以删除连接文件对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件。软链接有自己的inode, 并在磁盘上有一小片空间存放路径名

9.以下代码共调用多少次拷贝构造函数:()

Widget f(Widget u)
{
    
      
   Widget v(u);
   Widget w=v;
   return w;
}
main(){
    
    
    Widget x;
    Widget y=f(f(x));
}

A3;B5;C7;D8;
答案:B
解析:

Widget f(Widget u)//1次
{
    
      
   Widget v(u);//1次
   Widget w=v;//1次
   return w;
}//一共3次
main(){
    
    
    Widget x;
    Widget y=f(f(x));//嵌套,3*2=6次,y=,1次,一共7次
}

10.下面C程序的输出结果:()

int i=0,a=1,b=2,c=3;
i=++a||++b||++c;
printf("%d %d %d %d",i,a,b,c);

A.1 2 2 3
B.1 2 3 4
C.3 2 3 4
D.3 3 3 4
答案:A
解析:
++a为真,后面的语句直接屏蔽不执行

不定项选择

11.下列关键码序列哪些是一个堆()
A.90 31 53 23 16 48
B.90 48 31 53 16 23
C.16 53 23 90 31 48
D.16 31 23 90 53 48
答案::A D
解析:
i 为结点时,子节点为 i * 2 + 1,i * 2 + 2
A是大顶堆,每个节点都比其孩子大
D是小顶堆,每个节点都比其孩子小

12.有如下类的定义:

class Constants
{
    
      
public: static double GetPI(void){
    
    return 3.14159;}
};  
Constants constants;

下列各组语句中,能输出3.14159的是():
A.cout<<constants->GetPI();
B.cout<<constants.GetPI();
C.cout<<Constants::GetPI();
D.cout<<Constants.GetPI();
答案:B C
解析:
访问对象的成员函数的方法.、访问指向类的指针的成员函数的方法->、直接访问类的成员函数的方法::

13.下列对函数double add(int a , int b)进行重载,正确的是()
A.int add(int a ,int b ,int c)
B.int add(double a , double b)
C.double add(double a , double b)
D.int add(int a , int b)
正确答案:A B C
解析:
重载:
函数名相同
参数必须不同(个数或类型或顺序)
返回值类型可以相同也可以不同

14.对拷贝构造函数的描述正确的是()
A.该函数名同类名,也是一种构造函数,该函数返回自身引用
B.该函数只有一个参数,必须是对某个对象的引用
C.每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,则编译器系统会自动生成一个缺省拷贝构造函数,作为该类的保护成员
D.拷贝初始化构造函数的作用是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象
答案:B D
解析:
拷贝函数和构造函数没有返回值
拷贝构造函数的参数可以使一个或多个,但左起第一个必须是自身类型的引用对象
若类定义中没有声明拷贝构造函数,则编译器会自动生成一个缺省的拷贝构造函数,但是不会是该类的保护成员

15.test.c文件中包括如下语句:

#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a,b;
int_ptr c,d;

文件中定义的四个变量中,哪些变量类型是指针类型?
A.a
B.b
C.c
D.d
答案:A C D

INT_PTR a,b;
int_ptr c,d;

还原回来就是 int* a,b; int* c; int* d;
因为#define是宏定义,仅仅是直接替换。而typedef是把该类型定义一个别名。故此次b只是int类型。而 a,c,d才是指针类型。

16.以下关于传输层协议UDP的叙述中正确的()
A.比较合适传输小的数据文件
B.提供了高的可靠性
C.提供了高的传输效率
D.使用窗口机制来实现流量控制
答案:A C

17.以下有关Http协议的描述中,正确的有()
A.post请求一般用于修改服务器上的资源,对发送的消息数据量没有限制,通过表单方式提交
B.可以通过206返回码实现断点续传
C.HTTP1.1实现了持久连接和管线化操作以及主动通知功能,相比http1.0有大福性能提升
D.HTTP返回码302表示永久重定向,需要重新URI
正确答案: A B C
解析:
301永久重定向
302临时重定向

18.声明语句为 int a[3][4]; 下列表达式中与数组元素 a[2][1]等价的是
正确你的答案: A D (正确)
A.(a[2]+1)
B.
(a[1]+2)
C.a[9]
D.((a+2)+1)
答案:A D

18.查看下面两段代码

(1)
class classA {
    
    ...};
class classB
{
    
    
public:
    classB(classA a) {
    
    mA = a;}
private:
    classA mA;
};
(2)
class classA {
    
    ...};
class classB
{
    
    
public:
    classB(classA a): mA(a) {
    
    }
private:
    classA mA;
};

A.两种调用方法会产生相同的结果
B.通常情况下(1)的效率更高
C.通常情况下(2)的效率更高
D.两种调用方法会产生不同的结果
正确答案: C D

19.下列有关Nginx配置文件nginx.conf的叙述正确的是
A.nginx进程数设置为CPU总核心数最佳
B.虚拟主机配置多个域名时,各域名间应用逗号隔开
C.sendfile on;表示为开启高效文件传输模式,对于执行下载操作等相关应用时,应设置为on
D.设置工作模式与连接数上限时,应考虑单个进程最大连接数(最大连接数=连接数*进程数)
正确答案: A D
解析:
域名可以有多个,用空格隔开
sendfile on; 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。

20.下面关于异常处理,哪些说法是正确的?
A.所有在本方法中可能抛出的异常都必须显式的在方法上用throws进行声明。
B.Error的子类表示无法修复的问题
C.RuntimeException表示只在运行时(runtime)才可能出现这个异常。而普通Exception表示在运行 时(runtime)和编译期间(compile time)都可能出现这个异常
D.Throwable是Exception的子类
答案:B
解析:
A. 可以不用throws声明,也可以用try{}catch (Exception){} 进行处理,RuntimeException(非受查异常)不需要throw声明。
C. Exception:这种在编译时被强制检查的异常称为"受检查的异常",这种异常强制我们catch或throw的异常。遇到这种异常必须进行catch或throw,如不处理,编译器会报错。比如:IOException。
RuntimeException:运行时异常,这种异常我们不需要处理,完全有虚拟机接管,比如我们常说的NullPointerException,我们在写程序时不会进行catch或throw。
RuntimeException是继承自Exception的,只是虚拟机对这两种异常进行了区分。
D. Throwable是Exception的父类。

21.Java中Thread类中的start()方法和run()方法有什么区别?
A.start()方法创建一个线程,并内部调用run()
B.start()方法创建一个线程,但不会内部调用run()
C.run()方法创建一个线程,并内部调用start()
D.run()方法创建一个线程,但不会内部调用start()
答案:A

22.下面关于Java中weak reference的说法,哪个是正确的?
A.Weak reference指向的对象不会被GC回收。
B.Weak reference指向的对象可以被GC回收。
C.Weak reference 指向的对象肯定会被GC回收
D.Weak reference 指向的对象如果被回收,那么weak reference会收到通知
答案:B

23.java.lang.OutOfMemoryError: PermGen Space表示
A.Java heap内存已经用完
B.Java 堆外内存已经用完
C.Java 类对象(class)存储区域已经用完
D.Java 栈空间已经用完
正确答案: C
解析:
PermGen即Permanent Generation(持久代),在SUN的JVM中就是方法区

24.Linux文件权限一共10位长度(例如drwxrwxrwx),分成四段,第三段表示的内容是
A.文件类型
B.文件所有者的权限
C.文件所有者所在组的权限
D.其他用户的权限
答案:C
解析:
第一段是文件类型 占1位长度,包含文件(-)、目录(d),链接(l)
第二段是文件所有者的权限 3位长度,读(r)、写(w)、执行(x)
第三段是文件所有者所在组的权限 3位长度
第四段是其他用户的权限 3位长度

25.Linux改变文件所有者的命令为?
A.chmod
B/touch
C.cat
D.chown
答案:D
解析:
chmod改变文件权限
touch新建文件或者对文件时间戳进行修改
cat文本输出命令,一般用来查看文件内容
chown改变文件所有者

26.Linux终止一个前台进程可能用到的命令和操作
A.kill
B.ctrl+c
C.stop
D.halt
答案:B
解析:
kill命令用来删除执行中的程序或工作
ctrl+c命令是终止一个前台进程,是终止当前在终端窗口中运行的命令或脚本
ctrl+z命令是将任务中止(暂停的意思)
halt命令用来关闭正在运行的Linux操作系统

26.下列代码输出是:

public class ListParamTest {
    
    
	public static void resetList(List<Integer> dataList) {
    
    
		dataList.subList(2,4).set(0,40);
		dataList = new ArrayList<Integer>(dataList);
		dataList.add(50);
	}
	public static void setOne(List<Integer> dataList) {
    
    
		dataList.set(3,100);
	}
	public static void main(String[] args){
    
    
		List<Integer> dataList = new ArrayList<Integer>(Arrays.asList(10,20,30,null));
		resetList(dataList);
		setOne(dataList);
		int sum = 0;
		for(Integer v:dataList){
    
    
			sum +=v;
		}
		System.out.println(sum);
	}
}

A.160
B.170
C.抛出NullPointerException异常
D.抛出ArrayIndexOutOfBoundsException异常
答案:B
解析:
Arrays.asList(10, 20, 30, null) --> 10, 20, 30, null
dataList.subList(2,4).set(0,40); --> 10, 20, 40, null
dataList.add(50); --> 10, 20, 40, 50
dataList.set(3,100); --> 10, 20, 40, 100

27.新建一个流对象,下面哪个选项的代码是错误的?
A.new BufferedWriter(new FileWriter("a.txt"));
B.new BufferedReader(new FileInputStream("a.dat"));
C.new GZIPOutputStream(new FileOutputStream("a.zip"));
D.new ObjectInputStream(new FileInputStream("a.dat"));
答案:B

28.下列输出:

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
        System.out.println(f1 == f2);
        System.out.println(f3 == f4);
    }
}

A.true/false
B.true/true
C.fasle/ture
答案:A
解析:
Integer 类型的会缓存-128~127 之间的数

29.Java 中堆和栈有什么区别?
A.堆是整个JVM共享的
B.栈是每个线程独有的
C.栈是整个JVM共享的
D.对象可以分配在堆上也可以分配在栈上
答案:A B

30.下面关于Atomic(比方说AtomicLong)和synchronized关键字的说法哪些是对的?
A.两者都可以用于线程同步
B.synchronized关键字用于同步一段代码,而atomic用于同步某个状态
C.两者都可以用于同步一段代码
D.多个Atomic在代码中嵌套使用时可能会产生死锁
答案: A B

31.文件a的访问权限为rw-r–r--,现要增加所有用户的执行权限和同组用户的写权限,下列哪些命令正确的是?
A.chmod a+x g+w aaa
B.chmod 764 aaa
C.chmod 775 aaa
D.chmod o+x g+w aaa
答案: A C
解析:
增加所有用户的执行权限和同组用户的写权限
题目要求增加所有用户 所以执行的那一位都得加1
110 100 100->111 111 101->7 7 5

32.以下哪个函数不能直接出现在SQL的WHERE子句中
A.SUM
B.COUNT
C.ORDER BY
D.LIMIT
正确答案:A B

33.以下说法中正确的有
A.StringBuilder是线程不安全的
B.HashMap中,使用 get(key)==null可以判断这个HashMap是否包含这个key
C.Java类可以同时用abstract和final声明
D.volatile关键字不保证对变量操作的原子性
答案:A D

34.下面哪些是对称加密算法
A.DSA
B.RSA
C.DES
D.AES
答案:C D

35.以下哪些对接口methoda的定义是正确的
A.void methoda();
B.public final double methoda();
C.public double methoda();
D.static void methoda(double d1);
答案:A C

36.下面能让线程停止执行的有
A.sleep();
B.stop();
C.notify();
D.yield();
答案: A B D
解析:
sleep();线程休眠
stop(); notify(); 强制终止线程
yield(); 暂停线程

37.Hadoop HDFS Client端上传文件到HDFS上的时候下列不正确的是
A.数据经过NameNode传递给DataNode
B.数据副本将以管道的方式依次传递
C.Client将数据写到一台DataNode上,并由Client负责完成Block复制工作
D.当某个DataNode失败,客户端不会继续传给其它的DataNode
答案:A C D

猜你喜欢

转载自blog.csdn.net/qq_42748009/article/details/115128126