🦸个人主页: 小卢要刷力扣题
🦸♂️ 作者简介: 大三学生,准备找工作的人儿
🕍 推荐一款找工作神器网站: 《牛客网》 |笔试题库|面试经验|实习招聘内推|
⛪ 系列专栏: 《前端面试题》
🐋 希望大家多多支持😘一起进步呀!
📝 如果文章对你有帮助的话,欢迎评论💬点赞👍收藏📂加关注
前言
秋招正式批已经到来,相信不少小伙伴在为找工作而烦恼,对自己的实力不太自信,感觉好难找工作,不用怕,下面我来给各位推荐一个知名刷题网站《牛客》
一、牛客是做什么的?
牛客网,是一个集笔面试系统、题库、课程教育、社群交流、招聘内推于一体的招聘类网站。牛客是领先的数字化招聘求职解决方案服务商,牛客向企业提供校园招聘技术人才招聘一站式解决方案服务,主要包括招聘渠道服务(发校招岗位收简历) ,招聘SaaS工具服务(笔、面试 、群面系统 ),招聘传播服务(技术竞赛、广告、线上招聘专场、牛客职播。
牛客网题库中包含几万道题目,主要通过第三方购买和 UGC 的方式获得,牛客网先后尝试了直播和录播课,内容覆盖笔试题解析、面试技巧和机器学习等。
在里面可以与大家交流最近的面试心得,
如果不知道怎么面试的或者面试技巧掌握得不够牢固的小伙伴可以在牛客里面找面经来看,快速提升自己的面试能力,以更快的找到自己心仪的工作
奇安信春招前端笔试题-卷2
这一题考察的是计算机网络中ip数据操作
数据报是通过网络传输数据的基本单元,包含报头和数据本身,其中报头描述了数据的目的地址及与其他数据 之间的关系。
在数据操作方式中,每个数据报自身携带足够的信息,它的传送时被单独处理的。 整个数据传送过程中,不需要建立虚电路,网络节点为每个数据报作路由选择,各数据报不能保证按顺序到达目的节点,有些还可能丢失
因此选B
所有的动态路由协议在TCP/IP协议栈中都属于应用层的协议。但是不同的路由协议使用的底层协议不同。
OSPF将协议报文直接封装在IP报文中,协议号89,由于IP协议本身是不可靠传输协议,所以OSPF传输的可靠性需要协议本身来保证。
BGP使用TCP作为传输协议,提高了协议的可靠性,TCP的端口号是179。
RIP使用UDP作为传输协议,端口号520。
IS-IS协议是开放系统互联(OSI)协议中的网络层协议,IS-IS协议基础是CLNP(Connectionless Network Protocol,无连接网络协议)
路由协议的优先级
对于相同的目的地,不同的路由协议(包括静态路由)可能会发现不同的路由,但这些路由并不都是最优的。事实上,在某一时刻,到某一目的地的当前路由仅能由唯一的路由协议来决定。为了判断最优路由,各路由协议(包括静态路由)都被赋予了一个优先级,当存在多个路由信息源时,具有较高优先级(取值较小)的路由协议发现的路由将成为最优路由,并将最优路由放入本地路由表中。
路由器分别定义了外部优先级和内部优先级。外部优先级是指用户可以手工为各路由协议配置的优先级,缺省情况下如表1-1所示。
因此选B
1、多道:即计算机内存中同时存放几道相互独立的程序。
2、宏观上并行:同时进入系统的几道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕。
3、微观上串行:从微观上看,内存中的多道程序轮流地或分时地占有处理机。
静态优先算法,不管是可抢占的还是不可抢占的,都会发生饥饿的现象,因为优先级低得进程会长时间得不到运行。
为了解决静态优先算法的问题,所谓动态是指:在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。
因此选AD
节点的度:一个节点含有的子树数目。
树的度:最大的节点的度称为树的度。
度 和 节点的关系:
节点数目=所有节点度数之和+1
节点数=224+83+22+101+1=127
因此选C
初始化堆
堆的heapInsert()过程
因此答案为6 7 12 19 9 20 16 22 23 30 28
选B
因此选C
满二叉树时结点最多,高为h时一共有2^h-1个结点
因此选D
中缀表达式转后缀表达式
从原表达式求后缀式的规则为:
1.设定运算符栈
2.假设表达式的结束符为"#“,我们需要预设运算符栈底元素为”#"
3.扫描表达式,若当前字符是操作数,则直接发送给后缀表达式;
4.若当前字符为运算符且优先级大于栈顶运算符,则进栈,否则退出栈顶运算符并将其发送给后缀式。然后将当前运算符放入栈中。
5.若当前字符是结束符,则将栈中的全部运算符依次发送给后缀式。
6.若当前字符为"(“,进栈。
7.若当前字符为”)“,则从栈顶起,依次将栈中运算符出栈发送给ie后缀式,直到碰到”(“。将栈中”("出栈,不需要发送给后缀式。然后继续扫描表达式。
把D推导一遍,发现D能转为题目中缀表达式
因此选D
选C,link是链接
input没有这个属性
flex属性其实是一种简写,是flex-grow,flex-shrink和flex-basis的缩写形式。 默认值为0 1 auto
flex-basis: 定义在分配多余空间之前,项目占据的主轴空间(main size),浏览器根据此属性计算主轴是否有多余空间,
默认值为auto,即 项目原本大小;
设置后项目将占据固定空间。
因此选B
bind,call,apply都可以改变this指向
因此选A
a是行内元素,没有宽高
无法撑开div
因此选C
严格模式的约束有
1、不允许使用未声明的变量
2、不允许删除变量或函数
3、函数中不允许有同名的参数
4、eval 语句的作用域是独立的
5、不允许使用 with 语句
6、不允许写入只读属性
7、不允许使用八进制数
8、不能在 if 语句中声明函数
9、禁止使用 this 表示全局对象
因此选C
Object.assign() 方法将所有可枚举(Object.propertyIsEnumerable() 返回 true)和自有(Object.hasOwnProperty() 返回 true)属性从一个或多个源对象复制到目标对象,返回修改后的对象。
如果目标对象与源对象具有相同的 key,则目标对象中的属性将被源对象中的属性覆盖,后面的源对象的属性将类似地覆盖前面的源对象的属性。
Object.assign 方法只会拷贝源对象 可枚举的 和 自身的 属性到目标对象。该方法使用源对象的 [[Get]] 和目标对象的 [[Set]],它会调用 getters 和 setters。故它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含 getters,这可能使其不适合将新属性合并到原型中。
因此选C
函数声明写在运算符中,其为 true,但 放在运算符中的函数声明在执行阶段时找不到的 。
另外,对未声明的变量执行 typeof 不会报错,会返回 undefined
初看一下子就选了B,
但是B是错误的
因为new出来的是一个对象,不是函数,
因此选A
因此选A
这一题我也不知道为啥会有两个true
reload()方法用于刷新当前文档。
reload() 方法类似于你浏览器上的刷新页面按钮。
IP数据包由报头和数据两部分组成。报头的前一部分是固定长度,共20字节。在报头的固定部分的后面是可选部分——IP选项和填充域。
首部各字段的含义如下
1、版本
占4位,指IP协议的版本。
2、报头长度
占4位,该字段的单位是32位字(1个32位字长是4字节),因此当IP报头长度为1111时,报头长度就达到最大值60字节。当IP分组的首部长度不是4字节的整数倍是,就需要对填充域加以填充。最常用的报头长度为20位(报头长度值为0101),这时不使用任何选项。
3、区分服务(服务类型)
占8位,在一般情况下都不使用这个字段。
4、总长度
指报头和数据之和的长度,单位是字节。总长度字段为16位,故IP数据报的最大长度为65535。
每一种数据链路层都有其自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU。当IP数据报封装成链路层的帧时,此数据报的总长度不能超过对应MTU的值。若数据报长度超过对于MTU的值,就将数据报进行分片处理,此时数据报首部中的“总长度“字段是指分片后的每一个分片的报头长度和数据长度之和。
5、标识
占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并赋给标识字段。当数据报进行分片处理后,每个分片的标识值都与原数据报的标识值相同,则在接收端具有相同标识值的分片就能最终正确的重装成为原来的数据报。
6、标志
占3位,但目前只有两位有意义。
最低位记为MF。MF=1即表示后面”还有分片“的数据包。MF=0表示这已是若干数据包片中的最后一个。
中间位记为DF,意思是”不能分片“。只有当DF=0时才允许分片。
7、片偏移
占13位。表示每个数据报的分片在原数据报中的相对位置。片偏移以8个字节为偏移单位,即每个分片的长度一定是8字节的整数倍。
8、生存时间
占8位。表示数据报在网络中的寿命。最初以秒为TTL值为单位,现在以跳数为单位,则目前的最大数据为255.
9、协议
占8位,指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给那个处理过程。
TCP对应协议字段值6;UDP对应协议字段值17
10、首部校验和
占16位,该字段只校验数据报的报头,但不包括数据部分。
11、源地址
占32位
12、目的地址
占32位
A 正确 解释程序直接执行源程序或源程序的内部形式,一般是读一句源程序,翻译一句,执行一句,不产生目标代码
B 正确 编译程序与解释程序的区别之一在于前者生成目标代码,而后者不生成;此外,前者产生的目标代码的执行速度比解释程序的执行速度要快;后者人机交互好,适于初学者使用。而二者最大的区别在于:对解释执行而言,程序运行时的控制权在解答器而不在用户程序;对编辑执行而言,运行时的控制权在于用户程序。
C 正确 编译程序的工作过程可以分为6个阶段:词法分析、语法分析、语义分析、中间代码
生成、代码优化、目标代码生成
D 错误 解释器参与运行控制,程序执行的速度慢
1.堆是一棵完全二叉树
小根堆:任何子树的最小值是它的头节点
大根堆:同理,任何子树的最大值是它的头节点。
我们可以使用一个数组表示堆
当头结点为i时,左节点为 2i+1,右节点 为2i+2,父节点 为(i-1)/2
我们可以使用系统的堆PriorityQueue(优先队列),没设置比较器的时候为小根堆
当二叉树只有一个节点的时候,CD都错
let在全局声明的变量无法被window调用
只有var声明的会成为window的属性,通过window调用
因此ABCD都对
DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素
渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性
因此选ABC
get请求是否能有body,这个有争议
HTTP 协议没有为 GET 请求的 body 赋予语义,也就是即不要求也不禁止 GET 请求带 body。
大多数 HTTP 实现从技术上都支持 HTTP GET 请求带 body,少数实现会禁止(google-chrome 浏览器、node-fetch),少数实现会不建议(Fiddler)。
其他请求都是可以有body的
因此选BCD
cookie的大小为4k
其他选项都对,因此选ABDE
push往数组尾添加元素
splice() 方法用于添加或删除数组中的元素。
unshift往数组头添加元素
因此选ACD
transition只能定义动画开始到动画结束这二帧之间的过度效果,不能对动画过程中任意帧进行设置,而animation可以对动画过程中任意帧进行设置
transition必须有一个触发条件,不能在自动播放动画过度效果;animation在页面加载完成后自动播放动画效果
过渡属性可以是多个值,多个属性之间用逗号间隔。
因此选ACD
求n以内的质数,然后枚举所有的三元组(a,b,c),当a+b+c=n时更新最大体积。本题的加速可以从两方面入手:(1)枚举三元组时的剪枝;(2)用数学方法判断质数。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 得到体积的最大可能值
* @param n long长整型 长方形的长宽高之和。长宽高都为质数。
* @return long长整型
*/
public long getMaxVolume (long n) {
ArrayList<Long> primeTable = new ArrayList<>();
// 先求n以内的质数
for(long num = 2L; num < n; num++){
if(isPrime(num)){
primeTable.add(num);
}
}
int size = primeTable.size();
long maxVolume = 0;
for(int i = 0; i < size; i++){
for(int j = i; j < size; j++){
for(int k = j; k < size; k++){
if(primeTable.get(i) + primeTable.get(j) + primeTable.get(k) == n){
maxVolume = Math.max(maxVolume, primeTable.get(i) * primeTable.get(j) * primeTable.get(k));
}
}
if(i + j >= n){
break;
}
}
if(i >= n){
break;
}
}
return maxVolume;
}
private boolean isPrime(long num){
// 两个较小数另外处理
if(num == 2 || num == 3){
return true;
}
// 不在6的倍数两侧的一定不是质数
if(num % 6 != 1 && num % 6 != 5){
return false;
}
long temp = (long)Math.sqrt(num);
// 在6的倍数两侧的也可能不是质数
for(long i = 5; i <= temp; i += 6){
if(num % i == 0 || num % (i + 2) == 0){
return false;
}
}
// 排除所有,剩余的是质数
return true;
}
}
DFS进行全排列得到所有的方案,在生成方案的过程中检查方案是否满足所有A都在B之前(只需检查最后一个A是不是在第一个B之前),同时计数,将满足题意的方案添加进结果字符串。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
static int count = 0;
static StringBuilder res = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] bikes = br.readLine().split(" ");
permutation(bikes, 0, n - 1);
res.append(count);
System.out.println(res);
}
private static void permutation(String[] arr, int start, int end) {
if(start == end){
if(isValid(arr)) {
count ++;
StringBuilder path = new StringBuilder();
for(int i = 0; i < arr.length; i++){
path.append(arr[i]);
if(i < arr.length - 1){
path.append("-");
}else{
path.append(" ");
}
}
res.append(path.toString());
}
}else{
for(int i = start; i <= end; i++){
swap(arr, start, i);
permutation(arr, start + 1, end);
swap(arr, start, i);
}
}
}
private static boolean isValid(String[] arr) {
int lastA = 0, firstB = 0;
boolean flag = true;
for(int i = 0; i < arr.length; i++){
if(flag && "B".equals(arr[i])){
firstB = i;
flag = false;
}
if("A".equals(arr[i])){
lastA = i;
}
}
return lastA < firstB;
}
private static void swap(String[] arr, int i, int j) {
if(i != j){
String temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}