算法思想总结
2015-08-09 09:48
253 查看
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个元素,直接忽略;否则,使其替换数组中合适位置的元素。
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个元素,直接忽略;否则,使其替换数组中合适位置的元素。
相关文章推荐
- 线程--具体函数介绍
- Linux内核模块编译----Makefile 模板
- NYOJ 36 最长公共子序列 (动态规划)
- HDU 1272 小希的迷宫
- Leetcode解题笔记-Merge sorted Array
- Broadcast Receviewer
- MySQL性能优化
- fcntl函数
- C++primer笔记待续。。。
- 解决开机时因静电导致鼠标、显示屏和键盘无法工作的问题
- C语言:strlen()函数易错点
- G.723.1
- VS2010中打开VS2013/VS2012项目
- iOS设计模式之工厂方法模式
- Cgroup maintainer丽泽范:解剖Linux核心容器技术
- ThinkPHP与UCenter整合详解
- hdu5365
- 五年前的随笔(三)
- android 半边圆角的实现
- 协议