双指针的魅力

  • Post author:
  • Post category:其他



在解决问题过程中,经常碰到使用双指针解决的情况,使用双指针,可以很高效很快速的解决问题,罗列一下应用双指针的情况:


1,将给定的英文字符串进行反转,例如: I love programming。得到的结果是:.gnimmargorp evol I。下面给出核心代码:


#include<stdio.h>
#include<string.h>

void swap_string(char *p_start, char *p_end) {
	char temp;
	while(p_start <= p_end) {
		temp = *p_start;
		*p_start = *p_end;
		*p_end = temp;
		p_start++;
		p_end--;
	}
}

void main() {
	char str[] = "I love programming.";
	swap_string(str, str + strlen(str) - 1);
	printf("%s\n", str);
}


2,给定一个字符串,例如:”   test **   “,要求出去字母之外其他多余的字符,这也需要设定两个指针,一个慢指针和一个快指针,核心代码如下:


#include<stdio.h>
#include<string.h>

void trim_word(char *word) {
	char *p_slow = word;
	char *p_fast = word;
	while(*p_fast) {
		if(!(*p_fast >= 'a' && *p_fast <= 'z') && !(*p_fast >= 'A' && *p_fast <= 'Z')) {
			p_fast++;
		} else {
			*p_slow++ = *p_fast++;
		}
	}
	*p_slow = '\0';
}
void main() {
	char word[] = "   test **   ";
	trim_word(word);
	printf("%s\n", word);
}


如果给定的字符串是这样的:” test***ing “,这个算法也可以胜任的。


3,给定一个字符串,例如:”abccba”,判断它是否是回文。可以应用数组解决,但是数组的索引速度没有指针的移动速度快,所以设定两个指针,一个指向字符串开始,一个指向字符串结尾,同步移动。核心代码如下:


#include<stdio.h&g



版权声明:本文为zzran原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。