技巧 双指针

技巧 双指针

首先什么是双指针

(我们这里的指针并不是指向地址的指针而是数组的下标指针)双指针是利用数组的多个数组下标同时移动而减小遍历数组次数的一种技巧

双指针的运用场景

双指针的运用在数组,字符串中运用广泛,是学习算法的必学技巧

分为左右指针和快慢指针

我们将探讨的是左右指针

快慢指针在追赶问题以及滑动窗口中应用广泛

双指针详解(以回文串为例LeetCode125题)

由题意我们需将原字符串中的我们需要的字符放在另一个字符串中防止其他的符号干扰我们的判断

所以我们拷贝我们需要的字符串

sgood=(char*)malloc(sizeof(char)*(strlen(s)+sizeof(char)));
for(i=0;i<strlen(s);i++){
    if(s[i]>='A'&&s[i]<='Z'){
        s[i]+=32;
    }
    if((s[i]>='a'&&s[i]<='z')||(s[i]>='0'&&s[i]<='9')){
        sgood[j++]=s[i];
    }
}
sgood[j]='\0';

然后我们利用双指针left,right分别从字符串的开头和结尾开始比较,如果sgood[left]==sgood[right]相同,就left++;right--;直到两指针相遇或者差值为1(字符串长度为偶数或者奇数);然后返回ture,如果在比较的时候有一对不相等即sgood[left]!=sgood[right]就返回false

int len=strlen(sgood);
int left=0,right=len-1;
while(left<right&&left<len&&right>0){
    if(sgood[left]!=sgood[right]){
        return false; 
    }
    left++;
    right--;
}
return true;
}

下面给出完整代码

bool isPalindrome(char * s){
int i;
int j=0;
char *sgood;
sgood=(char*)malloc(sizeof(char)*(strlen(s)+sizeof(char)));
for(i=0;i<strlen(s);i++){
    if(s[i]>='A'&&s[i]<='Z'){
        s[i]+=32;
    }
    if((s[i]>='a'&&s[i]<='z')||(s[i]>='0'&&s[i]<='9')){
        sgood[j++]=s[i];
    }
}
sgood[j]='\0';
int len=strlen(sgood);
int left=0,right=len-1;
while(left<right&&left<len&&right>0){
    if(sgood[left]!=sgood[right]){
        return false; 
    }
    left++;
    right--;
}
return true;
}

总结

双指针是一个简单,高效,常用的算法技巧是每个程序员必备的技巧

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会C语言的菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值