翻转句子中单词的顺序和字符串的旋转操作 c++面试题

/*
题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。
为简单起见,标点符号和普通字母一样处理。如:”I am a student.”翻转成”student. a am I”。
——剑指offer
*/
法一:读入每一个字符串单词,将单词入栈接着将空格也入栈,运用栈先进先出的原则实现题目要求。

法二:首先将整个句子按字符翻转得到“.tneduts a ma I”,然后再将其中每个单词的字符旋转”student. a am I”。

#include<iostream>  
#include <stdio.h>
using namespace std;  
void reverse(char *pbegin,char *pend)
{
    if(pbegin == NULL||pend==NULL)
        return ;
    while(pbegin<pend)
    {
        char temp=*pbegin;
        *pbegin = *pend;//可以赋值是因为拍打她指向的是字符串变量
        *pend = temp;
        pbegin++,pend--;
    }

}
char* reversentense(char *pdata)
{
    if(pdata == NULL)
        return NULL;
    char *pbegin = pdata;
    char *pend = pdata;
    while(*pend!='\0')
        pend++;
    pend--;
    reverse(pbegin,pend);
    pbegin = pend = pdata;
    while(*pbegin!='\0')
     {
            if(*pbegin==' ')
           {    
                pbegin++;
                pend++;
           }
            else if(*pend==' '||*pend=='\0')
            {
                reverse(pbegin,--pend);
                pbegin = ++pend;
            }
            else
                pend++;
    }
    cout<<pdata<<endl;
    return pdata;

}


int main()  
{  
    char str[]="i am a student";
    char *reversestr = reversentense(str);
    cout<<reversestr;
}

同样的方法可以用于字符串的左旋转操作。字符串的左旋转操作是吧字符串前面的若干个字符转移到字符串的尾部。比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到的结果“cdefgab”。具体方法是:先分别旋转两组字符串,结果为”cbagfed”,然后再整体旋转,得“defgabc”
代码如下:

char *LeftRotateString(char* pstr,int n)
{
    if(pstr!=NULL)
        {
        int nlength = static_cast<int>(strle(pstr));
        if(nlengh>0&&n>0&&n<nlength)
            {
            char* pfirststart =pstr;
            char* pfirstend =pstr+n-1;
            char* psecondstart = pstr+n;
            char* psecondend = pstr+nlength-1;
            reverse(pfirststart,pfirstend);
            reverse(psecondstart ,psecondend);
            reverse(pfirststart ,psecondend);
            }
        return pstr;
        }
}

法二:先把第n个字符之后的内容赋给一个新的字符串变量,然后再复制前面的字符串。本方法更容易理解。

char* LeftRotateString(char* pstring,int n)
{
    int len =strlen(pstring);
    char *str3 = new char[len];
    char* str4 =str3;
    if(pstring!=NULL)
    {
        if(len>0&&n>0&&len>n)
        {
            for(int i=0;i<len-n;i++)
                *str3++ = *(n+pstring++);
            for(int i=0;i<n;i++)
                *str3++ = *pstring++;
            *str3 ='\0';
            return str4;
        }

    }
    return pstring;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值