面试算法?

链表逆序操作(不创建额外结构和空间

使用head和prev,next三个指针,prev初始化为null,head初始化为原链表的头节点。head是当前逆序结果新的头,prev是这个新头的next

详细链接

100位十进制数转化为二进制数

https://www.iteblog.com/archives/141.html

就是对字符串的操作,类似可以得出100位二进制数转化为十进制数的算法

找出N个数中的前M大的数:

https://blog.youkuaiyun.com/wangbaochu/article/details/52949443

使用堆排序,priority_queue最小堆,先将M个数压入堆中(维护一个大小为M的堆),然后读取接下来的数,和pq队列中的头比较,如果大于头,则将头弹出,压入该数。

对于n个数的堆排序,复杂度是O(nlogn),但是此题中不需要对N个数排序,所以复杂度为O(n+mlogm) .

如果M仍很大,则可以将M分成多份M‘ ,这样求出第 c e i l [ M M ′ ] ceil[\frac{M}{M'}] ceil[MM] 个就能找出第M个。

另外一种思想是用快排的思想,每次对一个数快排找到最终位置后,看最终位置K(下标为K)和M比较,从而知道需要继续处理左边还是右边。(这种只能用于找出第M大的数,复杂度为O(2n)=O(n) .

如何改进一个栈使得其min操作(找到最小值)只用O(1)复杂度

https://blog.youkuaiyun.com/ChenMiao0924/article/details/75714715

https://blog.youkuaiyun.com/tp93125334/article/details/52075437

方法1: 使用两个栈s1保存所有元素,s2栈顶保存s1中最小的元素。

开始时两个栈皆为空,此时第一次元素入栈时两个栈都要。

有元素入栈: 比较其与s2.top()的大小,若**<=s2.top()** (注意有等于,因为要保证最小元素个数一致)就要将该元素入s1和s2 两栈,否则只用s1.

有元素出栈:比较该元素是否等于s2栈顶元素,若等于,则s2栈顶元素出栈,否则只用s1出栈。

方法2:(只用一个栈,栈顶元素就是当前最小元素)

入栈操作:

当栈为空时,第一次push放入两个元素。

当栈不为空时,先将待入栈元素入栈,然后比较该元素和之前栈顶元素的大小,将更小的元素再入栈

出栈操作:

将栈顶两个元素都出栈,其中第二个出栈的元素就i是当前栈顶的元素。

找最小元素: 栈顶元素就是最小元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值