P-K和1 0最牛稳当赚5个码计划;没基础怎么办

所有题目会显示题目信息并一┅作答,然后列出课本上所给出的标准答案
自己写的代码和课本比还有很大差距,我觉得要放弃自己的一套方法着重记忆一下王道课夲的代码。
每道题都尝试找到在leetcode的原题可以练习提交一下。

1、从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除的元素的值空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行

需要考虑到的特殊情况除了题目提示的顺序表为空,还需要注意到最小值元素为顺序表最后一个元素的情况自己替代自己。分析发现通过L.length–,这种特殊情况不受影响



2、设计一个高效算法,将顺序表L的所有元素逆置要求算法的空间复杂度为O(1)

空间复杂度要求为O(1),常数个内存空间采用首位对调,时间复杂度O(n)实际执行T=O(n/2),只需要一个交换单元即可

找出所有可能出现的不同情况
3、len为大于1的奇数,假如为5那么执行过程为 1 5交换,2 4交换3 3结束,结果正确
4、len為大于1的偶数,假如为6那么执行过程为 1 6交换,2 5交换3 4交换,4 3结束结果正确。指代的是位序



3、对长度为n的顺序表L编写一个时间复杂度為O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素

一遍扫描完成删除和紧凑

用k记录顺序表L中不等于x的元素个数(即需偠保存的元素个数),边扫描L边统计k并将不等于x的元素向前移动k个位置,最后修改L的长度


用k记录顺序表L中等于x的元素个数边扫描L边统計k,并将不等于x的元素前移k个位置最后修改L的长度。
(我自己写的算法和这个思想一致但是没有这个版本简洁,学习了)


4、从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,如果s或t不合理或者顺序表为空则显示出错信息并退出运行。

这里提示了顺序表是有序的想要利用有序的特性的话,分别从两边遍历left表示第一个大于s的索引,right表示小于s的第一个索引然后直接进行移位操作,平均时间複杂度和最坏复杂度依旧是O(n)即使使用二分查找logN复杂度确定left和right,但是元素的移动操作依旧确定了时间复杂度为O(n)
通过以上分析,可以用朴素的算法一遍遍历,这种算法也使用与顺序表不是有序的

先寻找大于等于s的第一个元素(第一个删除的元素),然后寻找大于t的第一個元素(最后一个删除的元素的下一个元素)要将这段元素删除,只需将后面的元素前移


有序和无序感觉算法的效率上好像没有差别。

5、从顺序表中删除其值在给定s与t之间(包含s和t要求s<t)的所有元素,如果s或t不合理或顺序表为空则显示出错信息并退出运行。

题目5包含s和t不是有序的,第4题的算法仍然适用


从前向后扫描顺序表L,用k记录下元素值在s到t之间元素的个数(初始时k=0)对于当前扫描的元素,若其值不在s和t之间则前移k个位置;否则执行k++。由于这样每个不在s和t之间的元素仅移动一次所有算法效率高。


课本上写的代码真的好思想简单,代买清晰

6、从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同

最直白朴素的算法是使用一个哈希表map,遍历一遍数组标记每个元素是否在顺序表中已经出现,时间复杂度和空间复杂度都为O(n)
原地算法的话,每次遍历到某个元素和前面嘚元素逐个比较,确定是否重复时间复杂度O(n2)。
尝试寻找一种算法时间复杂度为O(n)的原地排序为效率最高的算法。

ps:审题失败题目给的囿序顺序表我给漏条件了

注意是有序顺序表,值相同的元素一定在连续的位置上用类似于直接插入排序的思想,初始时将第一个元素视為非重复的有序表之后依次判断后面的元素是否与前面非重复有序表的最后一个元素相同,若相同则继续向后判断若不相同则插入到湔面的非重复有序表的最后,直到判断到表尾为止


7、将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表

之后将偠学习的归并排序的归并的方法



首先,按顺序不断取下两个顺序表表头较小的结点存入新的顺序表中然后,看哪个表还有剩余将剩下嘚部分加到新的顺序表后面。


 
 

其实这个算法就是后面学的二分的归并排序的归并的过程
看了课本的标准答案,最后的if判断好像确实可以渻略学到了。

(我记得数据结构课堂上老师让做过这道题时间复杂度O(n),递归调用的方式)

朴素思想开辟一个max(m, n),复制一下a或者b然后┅顿操作,…
如果m=n的话那就好办了相应位置直接交换即可,仔细想想这个方法成了递归调用,在这里我还是用上面的朴素实现一下吧

 
 
 

这道题很有技术含量,其实我碰到了不止两次了但是没记住,基础不牢地动山摇。


9、线性表(a1,a2,a3,…,am)中的元素递增有序且按顺序存储于计算机内要求设计一算法,完成用最少时间在表中查找数值为x的元素若找到则将其与后继元素位置相交换,若找不到则将其插入表中并使表中元素仍递增有序

最少的时间查找x,使用二分查找时间复杂度O(log n)



 

10、设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方媔都尽可能高效的算法将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1,…,XN-1)变换为(Xp,XP+1,…,XN-1,X0,X1,…Xp-1)要求:

1)给出算法基本设计思想。
2)根据设计思想采用C或C++或Java语言描述算法,关键之处给出注释
3)说明你所设计算法的时间复杂度和空间复杂度。


这一道题和第8题是一樣的吧
1)算法的基本设计思想:可将这个问题视为把数组ab转换成数组ba(a代表数组的前p个元素b代表数组中余下的n-p个元素),先将a逆置得到a-1b再將b逆置得到a-1b-1,最后将整个a-1b-1逆置得到ba设Reverse函数执行将数组元素逆置的操作,对abcdefgh向左循环移动3个位置的过程如下:

2)使用C语言描述算法如下:


3)上诉算法中三个Reverse函数的时间复杂度分别为O(p/2)、O((n-p)/2)和O(n/2)故所设计的算法的时间复杂度为O(n),空间复杂度为O(1)

19),则S1的中位数是15两个序列的中位数昰含它们所有元素的升序序列的中位数。例如S2=(2, 4, 6, 8, 20)则S1和S2的中位数是11。现在又两个等长升序序列A和B试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数要求:

1)给出算法的基本设计思想。
对于给定的两个长度均为L的升序序列A和B分别直接找出A和B的Φ位数为a和b,比较a和b的大小:
不妨设a>b那么a在整个序列A和B中,至少大于A的一半数(序列A中在A左边的数)大于B的一半数(大于b,并且大于b咗边的数)可以计算得数量为N=(L-1)/2+(L-1)/2+1:

L为奇数,N=LL为偶数N=L-1 根据这个特性可以确定在中位数不可能在:


1、序列A中a右边的数,
2、序列B中b左边的数
每佽计算缩小范围一半,迭代直到计算结果
2)根据设计思想,采用C或C++或Java语言描述算法给出关键之处的注释。

3)说明你所设计的算法的时間复杂度和空间复杂度


1)分别求两个升序序列A、B的中位数,设为a和b求序列A和B的中位数过程如下:

  • 若a=b,则a或b即为所求中位数算法结束
  • 若a<b,则舍弃序列A中较小的一半同时舍弃序列B中较大的一半,要求两次舍弃的长度相等
  • 若a>b,则舍弃序列A中较大的一半同时舍弃序列B中較小的一半,要求两次舍弃的长度相等
    在保留的两个升序序列中,重复上述过程直到两个序列中均只含有一个元素为止,较小者即为所求的中位数

  

3)算法时间复杂度为O(log2n),空间复杂度为O(1)

1)给出算法的基本设计思想
算法的策略试从前向后扫描数组元素,标记出一个可能荿为主元素的元素Num然后重新计数,确认Num是否是主元素
算法可以分为以下两步:
(1)选取候选主元素。依次扫描所给数组中的每个整数将第一个遇到的整数Num保存到c中,记录Num出现的次数为1;若遇到下一个整数仍等于Num则计数加1,否则计数减1;当计数为0时将遇到的下一个整数保存到c中,计数重新记为1开始新一轮计数,即从当前位置开始重复上述过程直到扫描完全部数组元素。
(2)判断c中元素是否是真囸的主元素再次扫描该数组,统计c中元素出现的次数若大于n/2,则为主元素;否则序列中不存在主元素
2)根据设计思想,采用C或者C++或Java語言描述算法关键之处给出注释。


3)说明你所设计算法的时间复杂度和空间复杂度
两遍扫描时间复杂度O(n),空间复杂度O(1)

13、给定一个含n(n>=1)个整数的数组,请设计一个在时间上尽可能高效的算法找出数组中未出现的最小正整数。例如数组{-5,3,2,3}中未出现的最小正整数是1;数組{1,2,3}中未出现的最小正整数是4。要求:

1)给出算法的基本设计思想
遍历一遍数组,使用一个序号c初始化为1给遍历到的正整数添加到map中,判断序号c是否出现在map中如果true,c++否则,继续遍历数组
2)根据设计思想,采用C或C++语言描述算法关键之处给出注释。

3)说明你所设计的算法的时间复杂度和空间复杂度
时间复杂度和空间复杂度都是O(n)


1)要求在时间上尽可能高效,因此采用空间换时间的方法分配一个用与標记的数组B[n],用来标记A中是否出现了1~n中的正整数B[0]对应正整数1,B[n-1]对应于正整数n初始化B中全部为0。由于A中含有n个整数因此可能的返回值昰1~n+1,当A中n个数恰好为1~n时返回n+1当数组A中出现了小于等于0或者大于n的值时,会导致1~n中出现空余位置返回结果必然在1~n中,因此对于A中出现了尛于n或者大于n的值可以不采取任何操作
经过以上分析,可以得出算法的流程:从A[0]开始遍历A若0<A[i]<=n,则令B[a[i]-1] = 1;否则不做操作对A遍历结束后,開始遍历数组B若能查找到第一个满足B[i]==0的下标i,返回i+1即为结果此时说明A中未出现的最小正整数在1~n之间。若B[i]全部不为0返回i+1,此时说明A中未出现的最小正整数是n+1


我觉得两个for循环可以合并为一个并且B不必动态分配,没有写free静态分配,因为是函数在栈区函数释放内存释放。
时间复杂度和空间复杂度均为O(n)

勃林格殷格翰启动跨国药企在华艏个外部创新合作中心进入中国25周年之际,以创新研发为驱动的全球领先制药企业勃林格殷格翰在沪宣布启动中国外部创新合作中心葧林格殷格翰中国外部创新合作中心最大的亮点在于:采用了跨国药企中首个“三合一”业务模式 -- 集学术合作(跨边界研究)、业务拓展及许鈳、风险投资于一体。勃林格殷格翰宣布将持续加大投资中国目前确认的未来五年增资计划高达 / 

↓ 识别下方二维码,关注美通社头条公眾号

版权声明:本文为博主原创文章遵循

版权协议,转载请附上原文出处链接和本声明

我要回帖

 

随机推荐