京东作为知名的自营式电商企业,很多人都想去这样的大企业上班,当然了web前端工程师也不例外,所以今天小编通过各种途径收集了一部分京东web前端面试题,想要或者正准备去京东面试的小伙伴们,可以过来学习一下。
一 客观题
1.关于HTTP协议的说法,以下哪些说法是不正确的()
A. 有状态,前后请求有关联关系
B. FTP也可以使用HTTP协议
C. HTTP响应包括数字状态码,300代表此次请求有正确返回
D. HTTP和TCP、UDP是在网络分层里是同一层次的协议
答案:ABD
解析:
A,http协议是无状态的,因此需要cookie,session等对客户端浏览器做标明
B,FTP和HTTP都是应用层协议,不存在谁使用谁的问题
C,http的3xx状态码表示请求资源被转移
D,HTTP工作在应用层,TCP,UDP工作在传输层。
2.以下代码运行结果为()
#include
int main() {
uint32_t a = 100;
while(a > 0){
--a;
}
printf("%d",a);
return 0;
}
A. -1
B. 100
C. 0
D. 死循环
答案:C
解析:无符号数可以取到0,取不到负数
3.以下哪种排序算法需要开辟额外的储存空间()
A. 选择排序
B. 归并排序
C. 快速排序
D. 堆排序
答案:B
解析:
稳定排序:
泡沫排序(bubble sort) — O(n²)
插入排序 (insertion sort)— O(n²)
桶排序 (bucket sort)— O(n);需要 O(k)额外空间
计数排序 (counting sort) — O(n+k);需要 O(n+k)额外空间
合并排序 (merge sort)— O(n log n);需要 O(n)额外空间
二叉排序树排序 (Binary tree sort) — O(n log n)期望时间; O(n²)坏时间;需要 O(n)额外空间
基数排序 (radix sort)— O(n·k);需要 O(n)额外空间
不稳定排序
选择排序 (selection sort)— O(n²)
希尔排序 (shell sort)— O(n log n) 如果使用佳的现在版本
堆排序 (heapsort)— O(n log n)
快速排序 (quicksort)— O(n log n)期望时间, O(n2)坏情况;对于大的、乱数串行一般相信是快的已知排序
4.如果将固定块大小的文件系统中的块大小设置大一些,会造成()
A. 更好的磁盘吞吐量和更差的磁盘空间使用率
B. 更好的磁盘吞吐量和更好的磁盘空间使用率
C. 更差的磁盘吞吐量和更好的磁盘空间使用率
D. 更差的磁盘吞吐量和更差的磁盘空间使用率
答案:A
解析:文件是按块存储的,如果块大小设置的大一些,读取的时候一次性读取的就更多,磁盘吞吐量提升,但是文件可能不能占满整个块,导致利用率下降。
5.若一颗二叉树的前序遍历为a,e,b,d,c,后序遍历为b,c,d,e,a,则根节点的孩子节点()
A. 只有e
B. 有e,b
C. 有e,c
D. 不确定
答案:A
解析:前序遍历第一个是根节点,所以a是根节点
假设a有两个孩子节点,则前序遍历a后面为e,所以e必定属于a的左子树中的节点
后续遍历中a的前面挨着是e,所以e必定是a的右子树中的节点,相互矛盾。
因此a只有一个孩子节点。
在a只有一个孩子节点,也就是只有左子树或者只有右子树的情况下,前序遍历首先是根节点a,然后紧接着就是子树的跟节点,也就是a的唯一的孩子节点,所以e是a的子节点。
6.在一个世世代代都重男轻女的村庄里,村长决定颁布一条法律:村子里没有生育出儿子的夫妻可以一直生育指导生出儿子位置,假设现在村子的男女比例是1:1,这条法律颁布之后的若干年后村子的男女比例将会()
A. 男的多
B. 女的多
C. 一样多
D. 不确定
答案:C
生男生女概率都是0.5,这个概率并不会因为你之前生了n个女生而改变,所以终男女比为1:1.
7.批处理操作系统目的是()
A. 提高操作系统资源利用率
B. 提高系统与用户的交互性能
C. 减少用户作业的等待时间
D. 降低用户作业的周转时间
答案:A
解析:批处理操作系统是为了提高系统吞吐量和资源利用率
8.设有一个关系:DEPT(DNO,DNAME),如果要找出倒数第三个字母为W,并且至少包含4个字母的DNAME,则查询条件子句应写成WHERE DNAME LIKE()
A. '__W_%'
B. '_%W__'
C. '_W__'
D. '_W_%'
答案:B
9.已知的一个无向图(边为正数)中顶点A,B的一条短路P,如果把各个边的权重(即相邻连个顶点的距离)变为原来的2倍,那么在新图中,P忍让是A,B之间的短路。以上说法()错误。
A. 不确定
B. 正确
C. 错误
答案:B
10.如下程序的时间复杂度为(其中m>1,e>0)()
x = m;
y = 1;
while (x - y > e){
x = (x + y)/2;
y = m/x;
}
print(x);
A. log m
B. m2
C. m1/2
D. m1/3
答案:A
解析:Sum的值等于1+3+5+...+k=(k+1)^2/4且k为奇数
(k+1)^2/4 >= n时循环结束。N=484,所以(k+1)^2 >=1936
如果存在奇数k使得等会成立,则函数返回true,否则返回false
正好k=43时,等号成立。因此返回true
11.求fun(484)的返回值()
bool fun(int n){
int sum = 0;
for (int i = 1; n > sum; i = i+2)
sum = sum + i;
return (n == sum);
}
A. True
B. False
答案:A
12.关于主对角线(从左上角到右下角)对称的矩阵为对称矩阵: 如果一个矩阵中的各个元素取值为0或1,那么该矩阵为01矩阵,求大小为N*N的01对阵矩阵的个数? ( )
A. power(2, n)
B. power(2, n*n/2)
C. power(2,(n*n + n)/2)
D. power(2,(n*n - n)/2)
答案:C
解析:对称矩阵可以根据对角线下方的元素推断出上方的元素,因此只需要存储对角线及其以下的元素,第一行1个元素,第二行2个元...第N行有N个元素,加起来有 n(n+1)/2个元素。
此外,每个数字是0或1两种肯能,一次一共有power(2,n(n+1)/2)个不同的对角矩阵
13.现代的语言(如java)的编译器的词法分析主要依靠()
A. 有限状态自动机
B. 确定下推自动机
C. 非确定下推自动机
D. 图灵机
答案:A
14.如下函数的f(1)的值为()
int f(int n) {
static int i = 1;
if (n >= 5)
return n;
n = n+i;
i++;
return f(n);
}
A. 5
B. 6
C. 7
D. 8
答案 C
解析:基础题, 注意static int i是静态变量。
15.123456789101112...2014除以9的余数是((1+2014)*2014/2mod9 = 1)
二 编程题
1.给定字符串(ASCII码 0~255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:" i am a little boy. ",变成"i am a little boy.",语言不限,但不要用伪代码作答,函数输入输出请参考如下的函数原型:
C++ 函数原型:
void FormatString(char str[], int len){
}
void FormatString(char str[], int len)
{
if(str == NULL || len <= 0)
return;
int i = 0, j = 0;
while(str[i] == ' ')//开头的空格
i++;
while(str[i] != '\0')
{
if(str[i] == ' ' && (str[i+1] == ' ' || str[i+1] == '\0'))//中间或者结尾的空格
{
i++;
continue;
}
str[j++] = str[i++];
}
str[j] = '\0';
}
2.给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和小,描述你程序的坏时间复杂度,并实现具体函数,函数输入输出请参考如下的函数原型:
C++ 函数原型:
struct TreeNode {
TreeNode* left;//指向左子树
TreeNode* right;//指向右子树
TreeNode* father;//指向父亲节点
};
TreeNode* LowestCommonAncestor(TreeNode* first, TreeNode* second) {
}
思路一:我们首先找到两个节点的高度差,然后从较靠近根结点的一层开始向上找,若父节点为同一节点则该节点为解。
思路二:若允许浪费空间,那么可以用两个Stack来存储从first和second到根结点的各个节点,然后出栈时比较地址是否一致,后一个地址一致的节点为解。
三.(附加题:)
有n枚硬币按照0到n-1对它们进行编号,其中编号为i的硬币面额为Vi。两个人轮流从剩下硬币中取出一枚硬币归自己所有,但每次取硬币的时候只能取剩下的硬币中编号小的硬币或者编号大的硬币,在两个都采用优策略的情况下,作为先手取硬币的你请编写程序计算出你能获得硬币总面额的大值? (请简述算法原理,时间复杂度并实现具体的程序),语言不限。
int MaxValue(int V[], int n) {
}
答案:动态规划
第一个人每次都选择 当前+之后可以拿到的 大的值
当第一个人选择完成后,第二个人用同样的策略拿剩下的硬币中 当前+之后可以拿到的 大的值
用dp[i][j]记录在还剩v[i]~v[j]时,先拿的人可以多拿多少钱
用record[i][j]记录在还剩v[i]~v[j]时,先拿的人选择了哪一个 只有i和j两种可能
当只剩1个硬币的时候: dp[i][i] = v[i] //只能拿这个,无悬念
当只剩2个硬币的时候: dp[i][i + 1] = max(v[i], v[i + 1]) //一定选大的
当剩余硬币>=3个时,需要知道第二个人的策略: dp[i][j] = max(拿第一个 +
第二个人选择后剩下的能够拿到的大值, 拿后一个 + 第二个人选择后剩下的能够拿到的大值)
#include
#include
using namespace std;
int MaxValue(int v[], int n)
{
vector> dp(n, vector(n, 0)); //dp[i][j]表示在还剩v[i]~v[j]时,先拿的人可以多拿多少钱
vector> record(n, vector(n, 0)); //record[i][j]记录在还剩v[i]~v[j]时,先拿的人选择了哪一个 只有i和j两种可能
for(int i = 0; i < n; i++)
{
dp[i][i] = v[i];
record[i][i] = i;
}
for(int i = 2; i <= n; i++) //当前剩余硬币数量遍历
{
for(int s = 0; (s + i) <= n; s++) //起始位置遍历
{
int e = i + s - 1; //当前结束位置
int num1 = v[s], num2 = v[e];
if(i >= 3) //长度超过2的时候需要考虑剩下的硬币中能拿到的多的钱数
{
//假设拿第一个
if(record[s + 1][e] == s + 1) //第二个人会拿剩下的里面的第一个
num1 += dp[s + 2][e];
else //第二个人会拿剩下的里面的后一个
num1 += dp[s + 1][e - 1];
//假设拿后一个
if(record[s][e - 1] == s)
num2 += dp[s + 1][e - 1];
else
num2 += dp[s][e - 2];
}
record[s][e] = (num1 > num2) ? s : e;
dp[s][e] = (num1 > num2) ? num1 : num2;
}
}
return dp[0][n - 1];
}
热点新闻
前端开发技术库