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){