翻转单词序列

题目描述

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

思路一

public class Solution {
    public String ReverseSentence(String str) {
  		if(str == null ||str.trim().equals("")) return str;//需考虑到空格
        
        String[] arr = str.split(" ");
        int len = arr.length;
        StringBuffer sb = new StringBuffer();//这里不能初始化为null,否则下面的append方法会报错
        for(int i = len - 1;i >= 0; i--){
            sb.append(arr[i]+" ");//每个单词之间需要有空格
        }
        sb.deleteCharAt(sb.length() - 1);//删除最后一个空格
        String newStr = sb.toString();
        return newStr;
    }
}

思路二

先翻转整个句子,然后再翻转每个单词

TIM图片20190412202229

public class Reverse {

    public String ReverseSentence(String str) {
        char[] chars = str.toCharArray();
        //整体翻转
        reverse(chars,0,chars.length - 1);
        //标注空格的位置
        int blank = -1;
        for(int i = 0;i < chars.length;i++){
            if(chars[i] == ' '){
                //标注下一个空格的位置
                int nextBlank = i;
                //对每个单词进行翻转
                reverse(chars,blank + 1,nextBlank - 1);
                blank = nextBlank;
            }
        }
        //遍历完最后一个单词没有‘ ’所以需要单独进行翻转
        reverse(chars,blank + 1,chars.length - 1);//最后一个单词单独进行反转
        return new String(chars);//将char数组转为字符串类型

    }
    public void reverse(char[] chars,int low,int high){
        while(low < high){
            char temp = chars[low];
            chars[low] = chars[high];
            chars[high] = temp;
            low++;
            high--;
        }
    }
}

看一个c语言版的更加能体会其中的奥妙

char* ReverseSentence(char *pData)
{
    if(pData == nullptr)
        return nullptr;

    char *pBegin = pData;
    char *pEnd = pData;
    
    //将end指针移动到末尾处
    while(*pEnd != '') pEnd ++;
    pEnd--;

    // 翻转整个句子
    Reverse(pBegin, pEnd);

    // 翻转句子中的每个单词
    pBegin = pEnd = pData;
    while(*pBegin != '')
    {
        //如果翻转完一个单词,就将开始和结束的指针移向下一个单词
        if(*pBegin == ' '){
            pBegin ++;
            pEnd ++;
        }else if(*pEnd == ' ' || *pEnd == ''){ 
            //开始进行单词翻转
            Reverse(pBegin, --pEnd);
            //翻转之后移动两个指针到下一个单词的位置
            pBegin = ++pEnd;
        }else{
            //将末尾指针移动到每个单词的末尾处
            pEnd ++;
        }
            
    }

    return pData;
}
原文地址:https://www.cnblogs.com/flyingcr/p/10698537.html