58-01 翻转单词顺序

题目

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。

牛客网 OJ
AcWing OJ

C 语言题解

第一步翻转句子中所有的字符。比如翻转"I am a student."中所有的字符得到".tneduts a ma I",此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。
第二步再翻转每个单词中字符的顺序,就得到了"student.a am I"。

char* reverseWords(char *pData)
{
    // 检查输入的合法性
    if (pData == NULL)
        return NULL;

    char *pBegin = pData;
    char *pEnd = pData;
    
    while (*pEnd != '\0')
        pEnd++;
        
    // 此处需要注意,因为末尾处在'\0',所以需要向前一个位置
    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++;
    }

    return pData;
}

// 定义一个反转字符串的函数
void Reverse(char *pBegin, char *pEnd)
{
    if (pBegin == NULL || pEnd == NULL)
        return;

    // 遍历字符串收尾直接交换,直到达到中间位置
    while (pBegin < pEnd)
    {
        char temp = *pBegin;
        *pBegin = *pEnd;
        *pEnd = temp;

        pBegin++, pEnd--;
    }
}

C++ 题解

解题思路与C语言题解的思路一致。

class Solution {
public:
    string ReverseSentence(string str) 
    {
        char * pData = (char*)str.c_str();
        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);
                pEnd++;
                pBegin = pEnd;
            }
            else
            {
                pEnd++;
            }
        }
        
        return pData;
        }
    
    void Reverse(char *pBegin, char *pEnd)
    {
        if (pBegin == NULL || pEnd == NULL)
            return;

        // 遍历字符串收尾直接交换,直到达到中间位置
        while (pBegin < pEnd)
        {
            char temp = *pBegin;
            *pBegin = *pEnd;
            *pEnd = temp;

            pBegin++, pEnd--;
        }
    }
};

注意:

python题解

方法一

# -*- coding:utf-8 -*-
class Solution:
    def ReverseSentence(self, s):
        # write code here
        temp=s.split()
        if len(temp)==0:
            return s
        return ' '.join(s.split()[::-1])

注意:

  • 采用list[::-1]可以反转这个列表。

方法二

安装两步翻转的思想。

# -*- coding:utf-8 -*-
class Solution:
    def ReverseSentence(self, s):
        # write code here
        # 检查输入的合法性
        if s==None or len(s)<=0:
            return ''
        # 将字符串转换成列表
        s=list(s)
        # 反转字符串
        s=self.Reverse(s)
        pStart=0
        pEnd=0
        listTemp=[]
        result=''
        #print(s)
        while pEnd<len(s):
            # 如果是最后一个字符
            if pEnd==len(s)-1:
                #print(self.Reverse(s[pStart:]))
                listTemp.append(self.Reverse(s[pStart:]))
                break
            if s[pStart]==' ':
                pStart +=1
                pEnd +=1
                listTemp.append(' ')            
            elif s[pEnd]==' ':
                #print(self.Reverse(s[pStart:pEnd]))
                listTemp.append(self.Reverse(s[pStart:pEnd]))
                pStart=pEnd
            else:
                pEnd +=1
        # 列表重新转换成字符串
        for i in listTemp:
            result+=''.join(i)
        return result
    
    def Reverse(self,s):
        # s是一个list列表
        start=0
        end=len(s)-1
        while(start<end):
            s[start],s[end]=s[end],s[start]
            start+=1
            end-=1
        return s

注意:

  • python中实现两个值互换的方法。
  • 需要在字符串和列表之间相互转换。
posted @ 2019-01-31 16:06  youngliu91  阅读(112)  评论(0编辑  收藏  举报