天天看點

Codewars-Java程式設計刷題學習5- Stop gninnipS My sdroW!

剛看了下,有半個月沒刷題了,有點懈怠,還有就是最近在整其他的東西,忽略了,現在開始補上。

題目:

Codewars-Java程式設計刷題學習5- Stop gninnipS My sdroW!

[翻譯]

編寫一個函數,該函數接受一個或多個單詞的字元串,并傳回相同的字元串,但所有五個或更多字母的單詞都颠倒過來(如這個kata的名稱)。

傳入的字元串将隻包含字母和空格。

隻有出現多個單詞時,才會包含空格。

[例子]

spinWords("Hey fellow warriors") => "Hey wollef sroirraw" 

spinWords("This is a test") => "This is a test" 

spinWords("This is another test") => "This is rehtona test"

解: 根據題意可知,題目要求将字元串裡包含五個及以上個字元的單詞都颠倒過來。

颠倒字元串,一般能想到兩種方式:一是使用StringBuffer的reverse()方法、二是拆成字元數組倒過來再合起來,我這裡使用第一種。

public class SpinWords {

  public String spinWords(String sentence) {
      String rs = "";
      String[] strs=sentence.split(" ");
        for(String str : strs){
            if(str.length() >= 5){
                rs += new StringBuffer(str).reverse().toString() + " ";
            }else {
                rs += str + " ";
            }
        }
       return rs.trim();
  }
}
           

接下來,慣例閱讀高贊的代碼:

import java.util.Arrays;

public class SpinWords {

  public String spinWords(String sentence) {
    String[] words = sentence.split(" ");
    for (int i=0; i<words.length; i++) {
      if (words[i].length() >= 5) {
        words[i] = new StringBuilder(words[i]).reverse().toString();
      }
    }
    return String.join(" ",words);
  }
}
           

思路和我的是一樣的,但是他這個更簡潔明了,使用了String的join()方法,沒有我的代碼啰嗦。

import java.util.stream.*;
import java.util.Arrays;

public class SpinWords {

  public String spinWords(String sentence) {
    return Arrays.stream(sentence.split(" "))
                 .map(i -> i.length() > 4 ? new StringBuilder(i).reverse().toString() : i)
                 .collect(Collectors.joining(" "));
  }
}
           

高贊第二的代碼,思路一緻,就是循環和stream流的差別使用。

import java.util.Arrays;
import java.util.stream.Collectors;

public class SpinWords {
  public static final String WORD_DELIMITER = " ";
  
  public String spinWords(String sentence) {
    return Arrays.stream(sentence.split(WORD_DELIMITER, -1)).map(SpinWords::spinIfNecessary).collect(Collectors.joining(WORD_DELIMITER));
  }

  private static String spinIfNecessary(String word) {
    return spinnable(word) ? spin(word) : word;
  }

  private static boolean spinnable(String word) {
    return word.length() >= 5;
  }

  private static String spin(String word) {
    return new StringBuilder(word).reverse().toString();
  }
}
           

高贊第三的代碼,沒有那麼一目了然需要耐心看了,其實就是将高贊二中的每一步都拆出來成一個方法,在大型項目中這樣做可以做到低耦合高複用。

點此歡迎光臨我的個人網站【一幾文星球】

 微信公衆号,歡迎關注,一起學習。

Codewars-Java程式設計刷題學習5- Stop gninnipS My sdroW!