将句子的单词顺序逆序

Posted iamzhoug37

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将句子的单词顺序逆序相关的知识,希望对你有一定的参考价值。

package partice1;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Stack;

/**
 * “student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”
 */
public class ReverseSetence
{
    /**
     * 先将每一个单词逆序, 然后再将句子整体逆序
     * 时间复杂度O(N) , 空间复杂度O(1) , 但由于java string是不可变字符串, 所以由此带来的空间复杂度为O(N), 用c则没有这个...
     */
    public String ReverseSentence_best(String str)
    {
        if(str == null || str.length() == 0 )
            return str ;

        char[] chars = str.toCharArray() ;
        int left = 0 ;
        int right = 0 ;

        boolean change = false ;  //用于表示数组是否发生过逆序, 用于防止只有一个单词的句子出现, 如整个句子只有student一个单词, 就不需要整体逆序, 直接输出即可
        while (right < str.length())
        {
            boolean flag = false ; //用于标记不是空格的字母是否是第一个, 如果是就赋值给left进行逆序;  这个可以防止中间有多个空格如: student  i am这种情况
            while (right < chars.length && chars[right] != ‘ ‘)
            {
                if(!flag)
                {
                    left = right ;
                    flag = true ;
                }
                right++ ;
            }

            if(flag)
            {
                change = true ;
                int r = right - 1;
                while (left < r)
                {
                    swap(chars, left++, r--);
                }
            }
            right++ ;
        }

        if(change)
        {
            left = 0;
            right = chars.length-1;
            while (left < right)
                swap(chars, left++, right--);
        }
        return new String(chars) ;
    }

    private void swap(char[] chars , int p , int q)
    {
        chars[p] ^= chars[q] ;
        chars[q] ^= chars[p] ;
        chars[p] ^= chars[q] ;
    }

  
   /**
     * 这个是我第一次写的时候的思路, 使用一个辅助栈来进行逆序输出, 不好, 时间复杂度O(N), 空间复杂度O(N)
     */

public String ReverseSentence(String str) { if(str == null || str.length() == 0) return str ; Stack<String> stack = new Stack<>() ; int from = -1 ; for(int i=0 ; i<str.length() ; i++) { if(str.charAt(i) == ‘ ‘) { if(from != -1) { stack.push(str.substring(from , i)) ; from = -1 ; } stack.push(" ") ; } else if(from == -1) { from = i ; } } if(from != -1) stack.push(str.substring(from)) ; StringBuilder sb = new StringBuilder(str.length()) ; while (!stack.isEmpty()) { sb.append(stack.pop()) ; } return sb.toString() ; } public static void main(String[] args) { ArrayList<String> list = new ArrayList<>() ; list.add("i‘m a studnet") ; list.add("hello") ; list.add(" i am a student ") ; Iterator<String> it = list.iterator() ; while (it.hasNext()) { String str = it.next() ; System.out.println("|" + new ReverseSetence().ReverseSentence_best(str)+"|"); } } }

 

以上是关于将句子的单词顺序逆序的主要内容,如果未能解决你的问题,请参考以下文章

算法 句子逆序

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

华为机试HJ13:句子逆序

字符串练习题:句子的逆序

如何通过C#中的特定片段从句子中提取整个单词?

python编程题-句子的逆序