剑指offer系列之四十四:翻转单词顺序

简介:

题目描述

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

可以发现,要对一个句子进行翻转,可以先对整个句子进行翻转,之后再对每个单词进行翻转。而不论是返回句子还是翻转单词,都是对一个字符串进行翻转,所以可以实现一个翻转函数,对从start到end位置的字符进行翻转,直到start大于end的值。所以实现句子翻转的代码如下(已被牛客AC):

package com.rhwayfun.offer;

public class RotateSentence {

    public String ReverseSentence(String str) {
        if(str == null) return str;

        //先翻转整个句子
        char[] cs = str.toCharArray();
        int begin = 0;
        int end = cs.length -1;
        reverse(cs, begin, end);
        begin = end = 0;
        //再翻转每个单词
        while(begin < cs.length){
            if(cs[begin] == ' '){//如果第一个位置就遇到空格说明不是一个有效的单词
                begin++;
                end++;
            }else if(end == cs.length || cs[end] == ' '){
                //当end遇到空格,说明一个单词的结束,翻转这个单词
                reverse(cs, begin, --end);
                begin = ++end;
            }else{
                //end没有遇到空格
                end++;
            }
        }
        return new String(cs);
    }

    private void reverse(char[] str, int begin,int end){
        while(begin <= end){
            char temp = str[begin];
            str[begin] = str[end];
            str[end] = temp;
            begin++;
            end--;
        }
    }

    public static void main(String[] args) {
        String str = "hello world";
        RotateSentence r = new RotateSentence();
        String s = r.ReverseSentence(str);
        System.out.println(s);
    }
}
目录
相关文章
|
7月前
|
算法
算法编程(二十八):重新排列单词间的空格
算法编程(二十八):重新排列单词间的空格
64 0
|
7月前
|
C++
剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)
剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)
46 0
|
7月前
|
Java
【剑指offer】-翻转单词序列-40/67
【剑指offer】-翻转单词序列-40/67
|
7月前
剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
45 0
剑指offer 65. 翻转单词顺序
剑指offer 65. 翻转单词顺序
63 0
【基础算法】浅浅刷个小题 # 找不同 # 字符串中的单词数 # 重新排列字符串 #
【基础算法】浅浅刷个小题 # 找不同 # 字符串中的单词数 # 重新排列字符串 #
剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序
75 0
|
算法 Java Python
LeetCode每日一题-6:k个一组翻转链表
LeetCode每日一题-6:k个一组翻转链表
LeetCode每日一题-6:k个一组翻转链表
翻转单词顺序(简单难度)
翻转单词顺序(简单难度)
81 0
翻转单词顺序(简单难度)