美文网首页C算法&面试题
头尾遍历思想(待续)

头尾遍历思想(待续)

作者: AwesomeAshe | 来源:发表于2016-03-08 08:43 被阅读73次

case1:字符串:判断一个字符串是不是对称的
case2: 数组: 调整数组元素位置使奇数位于偶数前面
case3: 字符串: 翻转字符串
我之前一直不知道而现在觉得很巧妙的一个方法就是,定义两个指针pHead,pEnd,从头和尾向中间移动遍历。

case1,判断字符串是否对称,goog就是对称的

bool isSymmetical(char* pbegin, char* pend)
{
    //first check valid
    if (pbegin == NULL || pend == NULL || pbegin>pend)
        return false;

    while (pbegin<pend)
    {
        if (*pbegin == *pend)
        {
            pbegin++;
            pend++;
        }
        else
            return false;
    }
    //if not return yet, return 1
    return true;
}

case2:使奇数元素位于偶数元素前面
一种想法是新建两个临时数组用于存放奇数和偶数,但是这样会浪费额外的空间并且计算量大,我们可以从两头向中间遍历,遇到偶数和奇数则交换其位置

bool isEven(int n)
{
    return (n & 1)==0;
}

void swap(int* beg, int* end)
{
    int tmp = *beg;
    *beg = *end;
    *end = tmp;
}
//odd-even
void reorderArray(int* arr,int len)
{
    if (!arr || len == 0)
        return;
    int* beg = arr;
    int* end = arr + len - 1;

    while (beg < end)
    {
        while (!isEven(*beg))
            beg++;
        while (isEven(*end))
            end--;
        swap(beg, end);
    }
}

case3:
给定一个字符串如abcde,要求将钱n个元素移动到后面,比如n=2时为cdeab
要求复杂度为O(n),辅助内存为1
如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分, 通过旋转操作把这两个部分交换位置。 于是我们可以新开辟一块长度为n+1的辅助空间, 把原字符串后半部分拷贝到新空间的前半部分,在把原字符串的前半部分拷贝到新空间的后半部分。不难看出,这种思路的时间复杂度是O(n),需要的辅助空间也是O(n)
首先对 X和 Y 两段分别进行翻转操作,这样就能得到XTYT。接着再对 XTYT进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX。

char* LeftRotateString(char* pStr, unsigned int n)
{
  if(pStr != NULL)
{
int nLength = static_cast<int>(strlen(pStr));
if(nLength > 0 && n > 0 && n < nLength)
{
char* pFirstStart = pStr;
char* pFirstEnd = pStr + n - 1;
char* pSecondStart = pStr + n;
char* pSecondEnd = pStr + nLength - 1;
// reverse the first part of the string
ReverseString(pFirstStart, pFirstEnd);
// reverse the second part of the string
ReverseString(pSecondStart, pSecondEnd);// reverse the whole string
ReverseString(pFirstStart, pSecondEnd);}
}
return pStr;}
// Reverse the string between pStart and pEnd
void ReverseString(char* pStart, char* pEnd)
{
if(pStart != NULL && pEnd != NULL)
{
while(pStart <= pEnd)
{
char temp = *pStart;
*pStart = *pEnd;
*pEnd = temp;
pStart ++;
pEnd --;}
}
}

相关文章

  • 头尾遍历思想(待续)

    case1:字符串:判断一个字符串是不是对称的case2: 数组: 调整数组元素位置使奇数位于偶数前面cas...

  • C++遍历算法

    C++遍历算法 待续

  • 61.旋转链表(leetcode)

    1、思路 先进行一次遍历获取链表长度,并将链表头尾相接成环;第二次遍历,将遍历的指针指向新的头结点的前一个节点,再...

  • 深度优先遍历相当于树的前序遍历,递归思想 广度优先遍历相当于树的层序遍历,队列思想

  • 图的深度优先遍历和马踏棋盘算法

    图的深度优先遍历思想 图的遍历通常有两种遍历次序方案: 深度优先遍历和广度优先遍历。深度优先遍历(DepthFir...

  • 二叉树的遍历

    二叉树的遍历 二叉树常用的遍历方式有:前序遍历、中序遍历、后序遍历、层序遍历四种遍历方式,不同的遍历算法,其思想略...

  • SelectionSort

    思想:每轮遍历寻找最值(MAX,MIN),筛选出后,剩余元素重复进行第一轮遍历前 第一轮遍历中 Java展现其思想

  • 二叉树

    1、二叉树的遍历(递归思想) 中序遍历: 【左子树,节点,右子树】后序遍历: 【左子树,右子树,节点】中序遍历: ...

  • C++第16天: 第189-第214课 字符串容器,栈,队列,d

    1. 为什么栈和队列没有遍历接口,因为他们只有头尾能够被访问。所以当你想查看里面的数据时,需要用empty判断,并...

  • 2018-08-28

    思路:题中给定的的数组是已经排序好的,采用双指针在头尾指向,进行遍历,每次将指针所对应的元素相加,与目标数比较,相...

网友评论

    本文标题:头尾遍历思想(待续)

    本文链接:https://www.haomeiwen.com/subject/vrkzkttx.html