剑指offer:翻转单词顺序列

题意描述

将字符串中的单词进行反转。例如,“student. a am I” ——》“I am a student.”

解题思路

一、思路一

使用split分割字符串,添加入String数组,并倒序遍历,利用StringBuilder拼接每个字符串,最后返回。注意,当遍历到第一个元素之前,都要添加一个空格。

    public String ReverseSentence(String str) {
            if(str.trim().equals("")) return str;	//“ ” 与 “” 的情况
            StringBuilder sb = new StringBuilder();
            String[] string = str.split(" ");
            for(int i=string.length-1;i>=0;i--){	//倒序遍历
                sb.append(string[i]);
                if(i > 0){
                    sb.append(" ");	//遍历到第一个单词之前都要添加空格
                }
            }
            return sb.toString();
        }

二、思路二

先将字符串整体反转,再根据空格符号,依次反转部分字符串。

    public String ReverseSentence(String str) {
            if(str == null || str.trim().equals("")) return str;
            char[] chars = str.toCharArray();
            int len = str.length();
            swap(chars,0,len-1);	//反转整个字符串
            int start = 0,end = 0;
            while(start < len){
                if(chars[start] == ' '){	//start为空格,跳过
                    start++;
                    end++;
                }	//end移动到数组尾部 或 当前为空格,说明start与end之间已经构成一个单词
                else if(end == len || chars[end] == ' '){	
                    swap(chars,start,--end);	//当前end指向空格,需要向前回退一位
                    start = ++end;	//end当前为空格,下一位才是单词起始字符
                }else{
                    end ++;
                }
            }
            return new String(chars);	//转换成String再返回
        }
        public void swap(char[] chars,int start,int end){
            while(start < end){
                char temp = chars[start];
                chars[start++] = chars[end];
                chars[end--] = temp;
            }
	}
posted @ 2020-04-26 17:17  灵图  阅读(128)  评论(0)    收藏  举报