打印

【一天一道编程题】之 Two Pointer

[复制链接]
902|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
michael_llh|  楼主 | 2016-12-26 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 michael_llh 于 2016-12-26 16:51 编辑

今天我们简单介绍一个算法中常用的一个技巧,不算是算法题的分享,但是我们也归类到这里和大家分享。


Two Pointer
双指针技术,那么这个是什么意思呢?
首先我们需要明白一点,快慢指针一般是用在数组或者是字符串中,我们定义了两个指针,其中一个指针指向这个数组或者字符串的开头,另外一个指针指向这个数组或者字符串的末尾,构成双指针。

OK,明白了概念,那么我们看下它的简单应用。


Problem:
给定给一个字符串数组,反转这个数组并输出。

题意很简单,很好理解,那么我们看下没有利用双指针和利用双指针来实现的俄两种方式。


(实现语言:C++)
<font size="4" face="Helvetica">#include <iostream>
using namespace std;
#include <cstring>

void swap(char str[], int i, int j){
    char temp;
    temp = str[i];
    str[i] = str[j];
    str[j] = temp;
}

int main()
{
    char s[20] = "1 2 3 4 5 6 7 8 9";

    cout << "===== with no two pointer method reverse =====" << endl;   
    int n = strlen(s);
    for (int i = 0; i < n / 2; i++) {
        swap(s, i, n - i - 1);
    }   
    cout << s << endl;

    cout << "===== with two pointer method reverse =====" << endl;  
    int i = 0, j = strlen(s)-1;
    while (i < j) {
        swap(s, i, j);
        i++;
        j--;
    }   
    cout << s << endl;
}</font>


这里要注意一个问题,strlen函数得到的是字符串的长度,但是我们对于数组而言我们的计数是从0开始的,所以要注意减去1。如果使用的是C++的string类型,直接使用str.length,同样也要减去1.


对于双指针的应用我们还可以引申出很多,比如说排序好的数组进行折半查找,另外比如快慢指针也是双指针,可以用来判断单链表是否有环,以及它的入口点在哪里,同时还可以用来找有序链表的中位数。很多应用,后面有机会再进行延展。


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

381

帖子

8

粉丝