面试题42:翻转单词顺序,左旋转字符串

本文介绍了两种常见的字符串操作方法:一是翻转句子中单词的顺序;二是实现字符串的左旋转功能。通过具体的代码示例展示了如何使用三次反转的方法来完成字符串的左旋转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。

例如输入"I am a student.",则输出"student. a am I"。


思路:这个题目流传甚广,很多公司都多次拿来作面试题。首先,我们先考虑如何将一个字符串给反转过来,

void ReverseWord(char *pBegin, char *pEnd) //reverse a string
{
    if(pBegin == NULL || pEnd == NULL)
        return;
    
    char temp;
    
    while(pBegin < pEnd)
    {
        temp = *pBegin;
        *pBegin = *pEnd;
        *pEnd = temp;
        
        pBegin++;
        pEnd--;
    }

}


void Reverse(char *pStr) //first,reverse whole sentence then,reverse every string.
{
    if(pStr == NULL)
        return;
    
    char *pBegin = pStr;
    char *pEnd = pStr;
    
    char *p1 = pBegin;
    char *p2 = pEnd;
    
    
    while( *(pEnd+1) != '\0')
    {
        pEnd++;
    }
    
    ReverseWord(pBegin, pEnd);
    
    while(p2 <= pEnd)
    {
        while(*(p2+1) != ' ' && *(p2+1) != '\0')
            p2++;
        ReverseWord(p1, p2);
        
        p1 = p2 + 2;
        p2 = p2 + 2;
    }
}



问题二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转的功能。比如输入字符串“abcdefg”和数字2,

该函数将返回左旋转2位得到的结果"cdefgab"。


思路:利用问题一的思想,利用三次反转。将abcdefg转化为cdefgab,可以看作成先将abcdefg整个的反转过来,变成gfedcba,然后再将前一个部分和后一个部分在反转一起,于是就变成了我们希望得到的cdefgab。

void LeftRotate(char *pStr, int n)
{
    //左旋字符串
    if(pStr == NULL || n < 0)
        return;

    char *pBegin = pStr;
    char *pEnd = pStr + strlen(pStr) - 1;
    int length =static_cast<int>(strlen(pStr));
    
    if(n > length)
        return;
    
    ReverseWord(pBegin, pBegin+length-1);
    ReverseWord(pBegin, pBegin + length - n - 1);
    ReverseWord(pBegin + length - n, pEnd);
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值