将句子的单词顺序逆序

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)+"|"); } } }
原文地址:https://www.cnblogs.com/iamzhoug37/p/5503147.html