牛客网百度测试开发面经整理

  1. 手撕代码:一个数组,给一个目标值,在数组中找出两个数相加等于目标值

public int[] twoSum(int[] nums, int target) {

        Map<Integer, Integer> map = new HashMap<Integer, Integer>();

        int[] result=new int[2];

        for(int i=0;i<nums.length;i++){

            int value = target-nums[i];

            if(map.containsKey(value))

            {

               result[0]=i;

               result[1]=map.get(value);

                break;

            }         

            map.put(nums[i],i);

        }

        return result;

    }

  1. 数据库命令:

a)    更改一个字段唯一

ALTER TABLE `t_user` ADD unique(`username`);

b)   更改某一个字段的值;

update users set recordNum=2 where id =2;

c)    修改某个字段的默认值

alter table users alter column recordNum set default 0;

d)   删除一个记录;

delete from user where id = 1;

e)    删除表全部数据和表结构;

drop table table_name

f)     删除表全部数据,保留表结构,立刻释放磁盘空间(不可撤销)

truncate table table_name

g)   删除表全部数据,表结构不变(可撤销)

delete from table_name

h)    左连接

SELECT xxx FROM table_a A LEFT JOIN  table_b B ON A.PK = B.PK;

i)      子查询方式,怎样创建临时表

SELECT *

FROM employees

WHERE (employee_id,salary)=(

    SELECT MIN(employee_id),MAX(salary)

    FROM employees

);

  1. linux命令:

a)    定时删除一个文件;

crontab :https://www.runoob.com/linux/linux-comm-crontab.html

b)   查找目录下包含固定字符串的文件:

find ./* -type f -name "*.txt" | xargs grep "Hello"

c)    创建十个随机的文件

for n in `seq 10`

do

        name=$(echo $RANDOM|md5sum|tr ["0-9"] ["a-j"] |cut -c 2-11)

        touch /home/abc/test/shell1/shell01/$(echo $name)_test.html

done

d)   awk 以逗号分割输入第三列

cat temp.txt | awk ‘BEGIN{ORS=","} {print $0}’

反向:cat temp.txt | awk ‘BEGIN{ RS=","; } { print $0 }’

e)    如何用Linux命令寻找指定目录下的文件

find . -name 'my*'

f)     如何查看进程?

ps -ef

g)   ps -ef 和ps -aux的区别

aux可以查看cpu和内存的占有率。如果要查看父进程id和完整的cmd命令,用ef,比如:ps -ef | grep 'springboot'

h)    使用sed命令删除文件的最后一行

https://linux.cn/article-11276-1.html

i)      如何查看进程打开了那些文件

lsof -p 1

  1. 从输入URL到渲染出页面的过程

https://www.cnblogs.com/qing-5/p/11126524.html

  1. 线程创建与同步的方法

两种方式,JDK源码中写到,两种方式创建线程。Thread构建函数中不能接受Callable参数。

Runnable是对业务逻辑的抽象,而Thread是对线程的抽象。

Runnable是某个任务,而Thread是一个工作单位。

Runnable没有返回值,所以JDK抽象出Callable,有返回值,Callable也是对任务的抽象。

  1. 只出现一次的数字

https://leetcode-cn.com/problemset/all/?search=%E5%8F%AA%E5%87%BA%E7%8E%B0%E4%B8%80%E6%AC%A1%E7%9A%84%E6%95%B0%E5%AD%97

  1. TCP&UDP区别
  2. TCP为什么会保证顺序性

a)        为了保证数据的可靠传递,发送方必须把自己已发送的数据保留在缓冲区;

b)        为每个已发送的数据包保留一个超时定时器;

c)        如果在定时器超时之前接收到了来自对方的应答信息(可能是对本包的应答,也可能是对本包后续包的应答),则释放该数据包占用的缓冲区。

d)        否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止。

e)        接收方收到数据包后,先进行 CRC 校验,如果正确,则把数据交给上层协议,然后给发送方发送一个累计应答包,表面该数据已经收到,如果接收方也有数据要发送给发送方,应答包也可放在数据包中捎带过去。

  1. 数组中只有1,2,3,如何只扫一遍就排好序 三指针法

private static void GetSort(int[] nums) {
    int length = nums.length;
    int p1 = 0;
    int p3 = length - 1;
    int p2 = 0;
    while (nums[p1] == 1){
        p1 ++;
    }
    while (nums[p3] == 3){
        p3 --;
    }
    while (p2 < p3){
        if (nums[p2] == 2){
            p2 ++;
        }
        else if (nums[p2] == 1){
            swap(nums, p1, p2);
            while (nums[p1] == 1){
                p1 ++;
            }
        }
        else if (nums[p2] == 3){
            swap(nums, p2, p3);
            while (nums[p3] == 3){
                p3 --;
            }
        }
    }
}

  1. 进程和线程

a)    什么是进程和线程

进程是资源分配的最小单位,资源是进程向操作系统进行申请。

线程是CPU调度的最小单位,线程不能单独存在,必须归属进程,线程不会拥有资源,线程所使用的资源都来自于进程。

一个进程至少拥有一个线程,任何一个进程启动都必须要创建一个线程。

应用程序不是进程,只有启动后才是。进程是应用程序在计算机上的一次活动。

b)   进程通信

共享内存,消息队列,管道通信,信号量,Socket

c)    线程同步

synchronized , volatile , 重入锁 , ThreadLocal

d)  

 
   


进程的状态及转换

NULL—新建态:执行一个程序,创建一个子进程

新建态—就绪态:操作系统完成了进程创建的必要操作,并且当前系统的性能和虚拟内存的容量均允许。

就绪态—运行态:CPU空闲时选择一个就绪进程。

运行态—就绪态:时间片使用完;出现了优先级更高的进程,剥夺系统资源。

运行态—终止态:当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结。

终止态—NULL:操作系统完成善后操作,删除此进程。

运行态—等待态:等待使用资源;如等待访问外设资源;等待人工干预等

等待态—就绪态:资源得到满足;如外设资源处于空闲状态;人工干预完成等

e)   
线程的状态

  1. 集合区别

a)    ArrayList和LinkedList区别

                           i.          LinkedList 实现了 List 和 Deque 接口,一般称为双向链表;ArrayList 实现了 List 接口,动态数组;

                          ii.          LinkedList 在插入和删除数据时效率更高,ArrayList 在查找某个 index 的数据时效率更高;

                         iii.          LinkedList 比 ArrayList 需要更多的内存;

b)   Array和ArrayList区别

                                        i.              Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。

                                      ii.              Array 大小是固定的,ArrayList 的大小是动态变化的。

                                    iii.              ArrayList 提供了更多的方法和特性,比如:addAll(),removeAll(),iterator() 等等。

c)    Vector和ArrayList区别

                                        i.              相同点:这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合,即存储在这两个集合中的元素位置都是有顺序的,相当于一种动态的数组。

                                      ii.              Vector 是线程安全的,也就是说它的方法之间是线程同步(加了synchronized 关键字)的,而 ArrayList 是线程不安全的,它的方法之间是线程不同步的。

                                    iii.              Vector 在数据满时(加载因子1)增长为原来的两倍(扩容增量:原容量的 2 倍),而 ArrayList 在数据量达到容量的一半时(加载因子 0.5)增长为原容量的 (0.5 倍 + 1) 个空间。

d)   HashMap和HashTable区别

                                        i.              HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的;

                                      ii.              HashMap允许K/V都为null;后者K/V都不允许为null;

                                    iii.              HashMap继承自AbstractMap类;而Hashtable继承自Dictionary类。

  1. 遍历vector的方法有几种

//第一种:

for (String string : t) {

System.err.print(string);

}

//第二种

t.forEach(new Consumer<String>() {

      @Override

      public void accept(String t) {

             System.out.print(t);   

      }});

//第三种

for (int i = 0; i < t.size(); i++) {

      System.out.print(t.get(i));

}

//第四种

Iterator<String> it = t.iterator();

while (it.hasNext()) {

      String string = (String) it.next();

      System.err.print(string);

}

//第五种

Enumeration<String> enume = t.elements();

while(enume.hasMoreElements()){

   System.out.print(enume.nextElement().toString());

}

  1. HashMap的数据结构是怎样的

在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以HashMap将数组和链表结合在一起,发挥两者各自的优势,使用一种叫做链地址法的方式可以解决哈希冲突

  1. JAVA基础知识

a)    Java基本数据类型

 byte、short、int、long、float、double、char、boolean

b)   int和Integer区别

                                        i.              Integer是Int的包装类,Int是八种基本数据类型之一。

                                      ii.              Integer变量必须实例化以后才可以使用,而Int变量不需要实例化。

                                    iii.              Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,而Int是直接存储数据值。

                                    iv.              Integer的默认值是null,Int的默认值是0。

c)    java的自动装箱和拆箱

自动根据数值创建对应的 Integer对象,这就是装箱。

自动将包装器类型转换为基本数据类型,这个就是拆箱。

d)   对多态的理解

多态性分为编译时的多态性和运行时的多态性。

方法重载(overload)实现的是编译时的多态性(也称为前绑定)。

而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现运行时多态需要做以下两件事情,否则也是编译时多态:

1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法);

2. 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

e)    Java的三大特性

多态、封装、继承

f)     内存分配

堆区:由程序员手动分配和释放 内存泄漏是指分配的内存空间无法被系统回收也无法被继续使用

栈区:由编译器自动分配自动释放,用于存放局部变量和参数,栈区的对象先进后出

常量区:存放常量字符串,程序结束后系统释放

静态变量区:存放全局变量和静态变量,在变量在程序运行期间都存在

g)   抽象类和接口

抽象类和接口都不能直接创建对象,

接口没有构造器,抽象类有;

接口中的方法必须是抽象方法,抽象类中可以有非抽象方法;

接口必须实现所有的抽象方法,抽象类可以实现一部分。

h)    Throw和Throws的区别

throw用于方法内部,throws用于方法声明上;

throw后跟异常对象,throws后跟异常类型;

throw后只能跟一个异常对象,throws后可以一次声明多种异常类型。

i)      权限

public > protected > default > private

其它包 > 子类  > 同包 > 同类

 

  1. 代码题:1-7可以组成的不同且无重复的三位数
  2. 最长子数组之和

public int maxSubArray(int[] nums) {

int ans = nums[0];

   int sum = 0;

   for(int num: nums) {

if(sum > 0) {sum += num; }

else {sum = num; }

      ans = Math.max(ans, sum);

} return ans;

}

  1. 两个有序数组求中位数,长度相同

https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu-b/

  1. 内存分配

https://www.cnblogs.com/bky-nll/p/11117603.html

  1. 内存泄露的原因

https://www.jianshu.com/p/54b5da7c6816

静态集合类引起内存泄漏,在释放对象的时候却没有删除监听器,必须显式地关闭Connection(以及连接池中的Resultset Statement)对象,内部类的引用,单例对象持有外部的引用。

20.

 
   


计算机网络七层模型

  1. 计算机网络四层模型

网络接口层、网际互连层、传输层、应用层

  1. 代码是一个1-10000的顺序排列的数组,抽出一个数,参数是抽出之后的数组,返回抽出的是哪一个数,写个函数
  2. 什么是死锁

多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

  1. 死锁的四个必要条件

互斥条件、请求和保持条件、不剥夺条件、循环等待条件

  1. 解决死锁的方法

1) 抢占资源。从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态。

2) 终止(或撤销)进程。终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态解脱出来。

  1. 浅拷贝深拷贝,给一个具体例子,输出什么
  2. mysql 有哪些索引,用过哪些

a)     数据结构:B+索引,哈希索引

b)     物理存储:聚集索引,非聚集索引

c)     逻辑:主键索引、普通索引、多列索引、唯一索引、空间索引

  1. HTTP报文头

请求:

 

响应:

 

  1. 写一个字符串子串回文判断代码

    public int countSubstrings2(String s) {

        int res = 0;

        for (int i = 0; i < s.length(); i++) {

            //分奇偶考虑

            res += countSegment(s, i, i);

            res += countSegment(s, i, i + 1);

        }

        return res;

    }

    //start往左边跑,end往右边跑, 判断s[start, end]是否为回文

    public int countSegment(String s, int start, int end) {

        int count = 0;

        while (start >= 0 && end < s.length() && s.charAt(start--) == s.charAt(end++))

            count++;

        return count;

    }

  1. 一个班级,怎么给班级学生按分数分组,并得到哪个组的人最多?

https://blog.csdn.net/qq_36673106/article/details/80774496

  1. CPU调度算法有哪些

a)        先来先服务算法(FCFS——First Come First Serve):按照进程就绪的先后顺序使用CPU。特点:非抢占,公平,实现简单,长进程后面的短进程需要等很长时间,不利于用户体验。

b)        最短作业优先(SJF——Shortest Job First):具有最短完成时间的进程优先执行,非抢占。

c)        最短剩余时间优先(SRTN——Shortest Remaining Time Next):SJF抢占式版本,即当一个新就绪的进程比当前运行进程具有更短完成时间时,系统抢占当前进程,选择新就绪的进程执行。

特点:有最短的平均周转时间,但不公平,源源不断的短任务到来,可能使长的任务长时间得不到运行,从而产生 “饥饿”现象 (starvation)。

d)        最高响应比优先算法(HRRN——Highest Response Ratio Next):是一个综合算法,调度时,首先计算每个进程的响应比R,之后总是选择R最高的进程执行。

{响应比R = 周转时间 / 处理时间 =(处理时间 + 等待时间)/ 处理时间 = 1 +(等待时间 / 处理时间)}

特点:折中权衡

  1. Bug 的类型

代码错误、设计缺陷、界面优化、性能问题、配置相关、安装部署、安全相关、标准规划、测试脚本、。。。其他(功能类、界面类、性能类、易用性类、兼容性类、。。。)

  1. Bug 的等级

(1)   致命错误:

常规操作引起的系统崩溃、死机、死循环

造成数据泄露的安全性问题,比如恶意攻击造成的账户私密信息泄露

涉及金钱的计算

(2)   严重错误:

重要功能不能实现

错误的波及面广,影响到其他重要的正常功能实现,功能交互

非常规操作导致的程序崩溃、死机、死循环

外观难以接受的缺陷

密码文明显示

(3)   一般错误

次要功能不能正常实现

操作界面错误(包括数据窗口内列名定义,含义不一致)

查询错误,数据错误显示

简单的输入限制为放在前段进行控制(格式限制)

删除操作为未给出提示,误删

(4)   细微错误

界面不规范

辅助说明描述不清楚

提示窗口文字未采用行业术语

界面存在文字错误

  1. Bug 的生命周期

新建、指派、接受、修复、关闭

猜你喜欢

转载自www.cnblogs.com/hailey-M/p/12068937.html