zoukankan      html  css  js  c++  java
  • 翻转单词序列

    题目描述

    牛客最近来了一个新员工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;
    }
    
  • 相关阅读:
    总有段迷惑的人生
    codepage的重要性【转】
    开通博客
    js 正则常用方法
    关于小程序scrollview组件添加enableflex后布局失效的解决方案
    关于小程序使用async/await报错regeneratorRuntime is not defined的解决方案
    IE6中,一个Button同时打开两个下载窗口,并且可以自动关闭
    Create User
    Oracle: import tables use .dmp file in PL/SQL Developer
    VS在进行调试时,不能调试的原因列举如下
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10698537.html
Copyright © 2011-2022 走看看