好文档 - 专业文书写作范文服务资料分享网站

2020年京东精选50面试题及答案

天下 分享 时间: 加入收藏 我要投稿 点赞

int q3 = q2 + (ql - 1 - mid;; block_exchange (a, q2, mid, ql); merge_in_place (a, low, q2 - 1, q3 1); merge_in_place (a, q3 + 1, ql, high); } I

void main() {

int a[] = {爲 3, 5, 7,9, 2, 4,6,8,10}; int len = sizeof(a) /sizeof(int;; int mid = len / 2 - 1;

merge_in_place (a, 0, mid, len - 1); for(int i = 0; i < len; i++)

printf printfCXn^); }

a[i]);

-

23. 一个url指向的页面里面有另一个url,最终有一个url指 向之前

岀现过的url或空,这两种情形都定义为nulL这样构 成一个单链表。给两条这样单链表,判断里面是否存在同样 的url。url以亿级计,资源不足以hasho

本題可以抽象为有环和无环情况下的链表交叉问题: 情况一:两条单链表均无环

最简单的一种情况,由于两条链表如果交叉,他们的尾节点必然相等(Y字归并), 所以只需要判断他们的尾节点是否相等即可。 情况二:两条单链表均有环

这种情况只需要拆开一条环路(注意需要保存被设置成null的节点),然后判断 另一个单链表是否仍然存在环路,如果有在,说明无交叉,反之,则有交叉的情况。 情况三:两条单链表,一条有环路,一条无环路

这种情况显然他们是不可能有交叉的

附:如何判断一条单链表是否存在环路,以及找出环路的入口

快慢指针:在表头设置两个指针fast与slow, fast指针与slow指针同时向前移动, 但是f

as t每次移动2个节点,slow每次移动1个节点,若fast指向null或者fast==slow 时停止,这

时如果fast指向mil,则说明没有环路,若faSt==slow则说明有环路。 找环路入口:当

fast==slow时,将fast重新指向表头。slow原地不动。然后fast和 slow在同时以每次一个节

点的速度向前移动,当他们再次重合时,就是环路入口。证 明如下:

1.证明fast和slow肯定会重合 在slow和fast第一次相谒的时候,假定Slow走了 n步骤,环路的入口是在p步的时 候经过的,那么有slow走的路径:p+c = n; c为pl和p2相交点,距离环

路入口 的距离;fast走的路径:p+c+k*L =如;L为环路的周长,k是整数。显然,如 果从p+c点开始,pl再走n步骤的话,还可以回到p+c这个点同时p2从头开始走的话, 经过n步,也会达到p+c这点。

2. fast和slow在p+c点会重合,显然他们从环的入口点就开始重合

24.将单向链表reverse,如ABCD变成DCBA,只能搜索链表一 次.

#include

using namespace std; struct node [

char data; struct node *next;

};

typedef struct node NODE; void test_exercise() [

NODE *head = new NODE; /健立附加头结点 head~>next = NULL;

/彳创建链表*/

NODE *curr ent, *pr evi ous; previous = head; char irput;

cout ? ^Irput your list table NODE data, end with cin ? irput; while(irput J=) {

current - new NODE;

current-〉data - irpu■:; current\previous\previous = pr evi ous\

cout ? ^Irput your list table NODE data, end with cin ? irput;

/欄出链表*/ current - head\[

cout << current-〉data << current - current~>next;

}

cout << endl;

湖转链表*/ current - head\

NODE *p = current~>next;

NODE *q = p->next; while(q != NULL)

[

p->next = current; current - p; P = q; q = q->next;

}

p->next = current;

current - p; head->next->next = NULL; head\

/欄出链表*/

current = head~>next; while(current != NULL) {

cout << current-〉data << current - current~>next;

25. A,B,C,D四个进程,A向Buf里面写数据,B,C,D向Buf里面读 数

据,当A写完,且B,C,D都读一次后,A才能再写.用PV操作实 现.

且B, C, D都读一次后,A才能再写。用P, V操作实现。

empty full; mutex =1

A (){

B Ut

响B,C, D四个进程,A向buf里面写数据,B, C, D向buf里面读数据, 当A写完,

semaphore semaphore semaphore semaphore semaphore semaphore

while(true){ P(empty);

P(b); Pic 丿;

P(d); p(mutex); write (); v(mutex): v(full)

while(true){ p(full); p(mutex); write ();

v(mutex); v(empty); v(b);

C(){

while(true){

2020年京东精选50面试题及答案

intq3=q2+(ql-1-mid;;block_exchange(a,q2,mid,ql);merge_in_place(a,low,q2-1,q31);merge_in_place(a,q3+1,ql,high);}Ivoidmain(){inta[]={爲3,
推荐度:
点击下载文档文档为doc格式
8utyq5c5gu8mpoj7ocb09o8y29wtcx00z09
领取福利

微信扫码领取福利

微信扫码分享