zoukankan      html  css  js  c++  java
  • 将句子的单词顺序逆序

    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)+"|"); } } }
  • 相关阅读:
    限制结果集行数
    函数的差异
    运算符的差异
    数据类型的差异
    简介
    Spring源码阅读入门指引
    Spring的三种注入方式
    AOP面向切面编程
    leetcode771
    leetcode669
  • 原文地址:https://www.cnblogs.com/iamzhoug37/p/5503147.html
Copyright © 2011-2022 走看看