
双指针操作
文章平均质量分 50
taesimple
这个作者很懒,什么都没留下…
展开
-
调整数组顺序使奇数在偶数前面
思路:双指针p和q,p指向数组头部向后遍历直到遇到偶数停止,q指向数组尾部向前遍历直到到奇数停止,交换p和q指向的元素,然后p、q继续按上述规则移动;程序终止条件是p == q(无需再对p、q作防越界判断)类似的题有:调节字符串使小写字母排在大写字母前面代码如下:void process(int a[], int n){ assert(a != NULL); asser原创 2012-05-15 23:07:37 · 168 阅读 · 0 评论 -
最短长度的珠子
题目要求和分析见题库这儿只讲一点:p1和p2停下,得到序列,和当前最短序列比较完毕后,class为k-1(k为颜色数)。此时要保持class和color[],p1和p2重复那两个步骤,直至class再次等于k,会再次得到序列,再去和当前最短序列比较,如此循环。程序中止条件是p2越过最后一个元素循环至头一个元素(珠子是首尾相接的)代码如下:void shortest_chai原创 2012-05-15 20:40:07 · 230 阅读 · 0 评论 -
判断单链表存储的回文
思路:维护两个指针slow和fast,其中fast每次步进2,slow每次步进1,并且slow在步进过程中对单链表逆置。当fast遍历至尾结点时,slow恰好在链表中点位置,而链表前半段已全部被逆置。此时维护两个指针从中心出发向两头遍历判断回文。需要注意的一点:回文有奇偶两种长度,在fast步进过程中计数判断是哪种,据此设置中心指针的初始位置代码:typedef struct原创 2012-05-18 21:56:55 · 530 阅读 · 0 评论 -
找单链表的倒数第K个结点
思路:只需遍历一次单链表,维护两个指针p和q,初始时均指向头结点。p先移动k-1步,然后p和q同时移动直至p指向尾结点,此时q所指的结点即倒数第K个结点代码:typedef struct node{ int data; struct node * next;} Node;Node * process(Node * L, int k){ assert(L != NUL原创 2012-05-18 19:18:50 · 966 阅读 · 0 评论 -
最长回文子串
问题描述:求一给定字符串的最长回文子串,如google的最长回文子串是goog思路:遍历所有可能的回文串中心,维护两个指针p、q从中心向两边移动直至回文边界,统计该回文长度并与当前最长回文长度比较、更新。注意回文有奇数长度如aba和偶数长度abba两种情况代码:void process(char * s){ assert(s != NULL); int n = str原创 2012-05-18 19:04:10 · 239 阅读 · 0 评论 -
判断单链表是否有环
单链表有环是指原来的尾指针指向了该链表中的任意一个结点(不一定是头结点,也就是说不一定是循环链表)思路:设置两个指针fast和slow,都从链表头结点出发。fast每次步进2,slow每次步进1,因此fast相对于slow的步进速度是1。若有环则二者一定会重合,若无环则fast最先为NULL代码如下:int process(Node * L){ assert(L != N原创 2012-05-16 09:36:58 · 188 阅读 · 0 评论 -
判断数组中是否存在两数,其和等于给定值
思路:若数组无序,则先将数组排为升序。设给定值为sum,维护两个指针p和q,p指向数组头部,q指向数组尾部。若*p+*q sum,则q--;若*p+*q == sum,则存在这两个数;程序中止条件为p == q(因此避免了*p+*q == sum且p == q的情况)代码如下:int process(int a[], int n, int sum){ assert(a !=原创 2012-05-15 16:12:38 · 581 阅读 · 0 评论 -
求和为K的所有连续正整数序列
思路:维护两个指针p和q,分别指向当前序列和sum所对应序列的起点和终点。若sum N则p右移且sum减小;若sum == N则输出p、q所指序列,然后q继续右移,如此循环。程序中止条件为q > (N+1)/2,原因是:若序列存在一个或多个大于等于(N+1)/2的元素,则其和必然大于N代码:void process(int n){ assert(n > 0); int p原创 2012-05-19 19:52:42 · 443 阅读 · 0 评论