数据结构之数组和链表之面试篇

一.        计算复杂度

计算复杂度的两种类型:

1.   循环主体中的变量参与循环条件的判断。此类题应该找出主体语句中与T(n)成正比的循环变量,将之代入条件中进行计算。

即执行了T(n)次后,参与循环条件判断的循环变量(i或者y)变成了多少。最后算出T(n)。

1

Inti=1;

While(i<=n){

i=i*2;          (每次要执行的主体语句)

}

T(n)就是到最后要执行的次数。执行T(n)后,变量i变成了2的T(n)次幂,用T(n)的表达式代替i,并且带入循环条件While(i<=n)中。最后T(n)=log2n

2

 Int y=5;

While((y+1)*(y+1)<n){

  Y=y+1;

}

执行T(n)后,变量y= T(n)+5. 用T(n)的表达式代替y,并且带入循环条件(y+1)*(y+1)<n。所以(T(n)+5+1)*(T(n)+5+1)<n。所以结果是根号n

2.   循环主体中的变量与循环条件无关。

l  递归程序一般使用公式进行递推.

1

求整数n阶乘,

Int fact(int n){

  If(n<=1)return 1;

  Returnfact(n-1)*n;

}

T(n)= T(n-1)+1= T(n-2)+2= T(1)+n-1

2

For(i=n-1;i>1;i--){

  For(j=1;j<I;j++){

  A[j]与A[j+1]互换;

}

}

I=n-1时,主体语句执行n-1次

I=n-2时,主体语句执行n-2次

把结果累积相加

l  非递归程序比较简单,可以直接累计计数.

例1:

For(i=1;i<n;i--){

   For(j=1;j<k;j++){

   M++;

}

}

T(n)=i*j

二.        线性表:顺序表和链表

顺序表:

l  P17中2,8,10题:顺序表逆置或者说顺序表循环移位问题

题目:对abcdefgh向左循环移动3(或者p)个位置变成defghabc

答案:reverse方法就是用一个temp变量,然后i<length/2,把数组逆置。

逆置Reverse(0,p-1)

           逆置Reverse(p,n-1)

          逆置Reverse(0,n-1)

l  P17中3,6题:删除表中值为x的元素或删除表中重复的元素

两个变量,一个变量用作类似产生了新表,一个变量遍历整个顺序表。

l  P17中的7题:合并两个有序的顺序表为一个有序的顺序表(经典算法)

方法:循环两两比较连个顺序表,小者存入结果表,还剩下没有比较完的顺序表连接到结果表中。

l  P17中的9题:查找值为X的元素

方法:二分查找,并了解二分查找失败后的high和low的位置。

l  找到无序数组中第二大的数。

方法:用两个变量,把前两个数保存到两个变量中。后面每个元素都和两个变量中的元素比较。大于其中的最大值就替换,如果小于最大值大于第二大的值替换第二个变量。



链表:

l  P37中5,21题:逆置单链表/输出倒数第k个数

方法:拆下头结点,利用头插法进行逆置

l  P37中6和9题:关于链表排序中的比较大小问题

方法:从原链表中第一个元素开始拆下来,产生新链表,跟新链表中每个元素进行比较。在新链表中找到和的位置插入。

l  P37中的22题:公共节点问题

方法:首先判断两个链表的长度,调整到同一个起跑线上同步后移,到指向同一个元素结束。

l  使用到两个指针来进行判断的问题

1/(21题输出倒数第k个数):

解:链表长length=10,第一个指针先从第一个节点走k步,还剩10-k步没有走。这时第二个指针开始从第一个节点开始和第一个指针同时走,知道第一个指针到最后,第二个指针指的就是倒数第k个数。

2/判断一个单链表是否有环及环的链接点

解:给定一个单链表,只给出头指针h

1、如何判断是否存在环?

2、如何知道环的长度?

3、如何找出环的连接点在哪里?

4、带环链表的长度是多少?

 

解法:

1、对于问题1,使用追赶的方法,设定两个指针slowfast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。

2、对于问题2,记录下问题1的碰撞点pslowfast从该点开始,再次碰撞所走过的操作数就是环的长度s

3、问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。(证明在后面附注)

4、问题3中已经求出连接点距离头指针的长度,加上问题2中求出的环的长度,二者之和就是带环单链表的长度

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值