算法思想总结

1、求字符是否重复,可创建一个大小为256的数组,遍历字符,将出现过的字符对应的assic码为索引的数组元素做标记。

2、逆序连续存储的序列:将low和对应的high位交换。

3、判断是否是全排列:排序之后判断对应位置为是否一致。

4、不借助中间存储旋转矩阵:右旋90度可以转化为先沿正对角线翻转,然后上下翻转。

5、判断一个字符换是否是另外一个的循环移位:若s1是s2的循环移位(首先s1和s2的长度必须相等),那么s1一定是s2+s2(两个s2拼接)的子串。

6、返回单链表的第k个节点:

1)、以距离为k的两个指针,开始从头到尾移动,当前边的指针到达尾部,后边的指针刚好在第k 个位置。

2)、递归   使用递归的方法,从头节点遍历到尾节点,递归的终止条件设为遍历到尾节点return;在递归的最后一层开始返回时开始使用static变量计数,由于满足条件在递归的中间某一层,而不是最上层的函数;使用static 变量保存满足条件值最终返回。

7、删除单链表的当前节点:由于是单链表,只能够删除指针之后的节点,于是可以将后继节点的数据复制过来,然后将后继结点删除。

8、判断单链表是否有环:使用快慢指针,快指针每次两步,慢指针每次一步,如果最后能够相遇,说明有环。

如果需要判断环的入口:慢指针走了n步,快指针走了2n步;那么有2n - n = mS,S是环的长度,也即快指针走了2mS步。如果此时快指针也每次走一步,而慢指针从头开始,那么快指针走的距离是x + 2mS,慢指针离起点的距离是x; 发现刚好差为 x + 2mS - x 为整圈数;如果慢指针刚好走到入口处,由于快指针比起多了2mS,那么快指针一定也是在出口处与慢指针相遇。

9、快慢指针用处2:快慢指针同时从头结点开始移动,快指针到尾节点时,慢指针刚好到链表的中间位置  注意奇数和节点和偶数个节点的区别   同时判断p->next  和 p->next->next非空。

10、判断两个单链表时候交叉:逆序两个链表,用两个指正分别遍历两个链表,如果有交叉,第一个节点一定相同;且最后一个相同的节点就是原来的交叉点。

11、升字典序全排列

从右往左寻找第一个比其右边相邻元素小的位置为标记位a,再次从右往左寻找第一个比a位置大的位置b,交换a,b两个位置的元素,然后将a位置之后的所有元素逆序即得到当前排列的下一个字典序排列。

12、可以用两个栈来模拟一个队列

一个栈A模拟往一端进,另外一个栈B模拟另外一端出。但需要出队时,若B中元素为空,便将A中的都弹出,压入到B中,然后从B中弹出即出队。

13、可以用一个队列来模拟一个栈

每当元素入队后,如果队列的元素超过一个时,就让该元素的前边的所有元素先出列,然后再入列;从而最后入列的元素总在队列最前边。

14、可以用map模拟 multiset

用关键字用关键词出现的次数为pair,可以用来模拟multiset。

15、确定N个元素的第k个最大者:将前k的元素放到数组中,并降序排序,然后依次取出剩下的元素;如果其不大于第k个元素,直接忽略;否则,使其替换数组中合适位置的元素。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值