bekitty

我不会讲大道理,可我心里有一杆秤。 我看这个世界很苛刻,可我的心里很宽容。 我不需要权力与利益,可是我需要公平与正义。 我始终知道正道难行,可不得不行。

导航

leetcode-Reverse Words in a String 反向输出字符串

Posted on 2014-05-24 13:45  bekitty  阅读(762)  评论(0编辑  收藏  举报

题目地址 https://oj.leetcode.com/problems/reverse-words-in-a-string/

 

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

 

Clarification:

 

    • What constitutes a word?
      A sequence of non-space characters constitutes a word.
    • Could the input string contain leading or trailing spaces?
      Yes. However, your reversed string should not contain leading or trailing spaces.
    • How about multiple spaces between two words?
      Reduce them to a single space in the reversed string.

对于本题,网上好多方法用split,而对split方法的内部结构不了解的话,很容易出错误。

 

由于题目中要求输出中不允许包含开头和结尾的空格,并且输出时单词中间的空格要被缩减为一个,所以想到了计算出单词的数量后,用ArrayList保存每个单词,反向遍历输出即可。

 

package edu.bupt.cici.leetcode;

import java.util.ArrayList;

public class ReverseWordsInAString {
    ArrayList<String> word = new ArrayList<String>();

    public String reverseWords(String s) {

        int wordNum = calWordNum(s);

        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < wordNum; i++) {
            sb.append(word.get(wordNum - i - 1));
            if (i != wordNum - 1) {
                sb.append(" ");
            }
        }

        return sb.toString();

    }

    private int calWordNum(String s) {
        // TODO Auto-generated method stub
        int cursor = 0;
        int wordNum = 0;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            if (i == 0) {
                if (s.charAt(i) == ' ') {
                    continue;
                } else if(s.length()!= 1){
                    sb.append(s.charAt(i));
                    cursor++;
                }else if(s.length() ==1){
                    sb.append(s.charAt(i));
                    word.add(sb.toString());
                    wordNum++;
                }

            } else if (i == s.length() - 1) {
                if (s.charAt(i) == ' ') {
                    if (cursor != 0) {
                        wordNum++;
                        word.add(sb.toString());
                    }
                } else {
                    if (cursor == 0) {
                        wordNum++;
                        sb.append(s.charAt(i));
                        word.add(sb.toString());
                    } else {
                        sb.append(s.charAt(i));
                        word.add(sb.toString());
                        wordNum++;
                    }
                }
            } else {
                if (s.charAt(i) == ' ') {
                    if (cursor == 0) {
                        continue;
                    } else if (cursor != 0) {
                        cursor = 0;
                        wordNum++;
                        word.add(sb.toString());
                        sb.delete(0, sb.length());
                    }
                } else {
                    sb.append(s.charAt(i));
                    cursor++;
                }

            }
        }
        return wordNum;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s = "the sky is blue";
        ReverseWordsInAString rw = new ReverseWordsInAString();
        System.out.println(rw.reverseWords(s));
    }

}