2016-09-03 9 views
-3

は私の宿題です:どのようにこのCodingBat Javaメソッドのいずれかを解決するには?ここ

彼らは非空であり、彼らの最初の文字が同じであれば、我々はその2つの文字列の「一致」と言うでしょう。ループして、空でない文字列の配列を次のように返します。文字列が配列の前の文字列と一致する場合は、配列内の2つの文字列を入れ替えます。配列内の位置がスワップされると、何も一致しなくなります。マップを使用すると、配列上を1回だけ通過させることができます。マップで

allSwap(["ab", "ac"]) → ["ac", "ab"] 

allSwap(["ax", "bx", "cx", "cy", "by", "ay", "aaa", "azz"]) → ["ay", "by", "cy", "cx", "bx", "ax", "azz", "aaa"] 

allSwap(["ax", "bx", "ay", "by", "ai", "aj", "bx", "by"]) → ["ay", "by", "ax", "bx", "aj", "ai", "by", "bx"] 

答えて

1

、値としてキーとして最初の文字、およびキーの最新のインデックスを格納します。地図に文字がない場合は、マップに追加します。地図に文字がすでに存在する場合は、マップから文字を取り除き、そのインデックスに置き換えます。

/** 
* Swaps strings in the array that have the same first letter, 
* reading left to right. Once a string has been swapped, 
* it will not be swapped again. The input array will be mutated. 
* 
* @param strings the strings to perform swaps from 
* @return   the strings after swapping 
*/ 
public static String[] allSwap(final String[] strings) { 
    // map of first characters, and the index where they were last seen 
    final Map<Character, Integer> potentialSwap = new HashMap<>(); 

    for (int thisIndex = 0; thisIndex < strings.length; thisIndex++) { 
     if (strings[thisIndex].isEmpty()) { 
      continue; // skip empty strings 
     } 

     final Character firstChar = strings[thisIndex].charAt(0); // box charAt(0) 
     // remove firstChar from the map. If it's not found, returns null 
     final Integer potentialIndex = potentialSwap.remove(firstChar); 

     if (potentialIndex != null) { 
      final int thatIndex = potentialIndex; // unbox potentialIndex 
      // swap values at thisIndex and thatIndex 
      final String temp = strings[thatIndex]; 
      strings[thatIndex] = strings[thisIndex]; 
      strings[thisIndex] = temp; 
     } else { 
      // save the index for possible swapping later 
      potentialSwap.put(firstChar, thisIndex); // box thisIndex 
     } 
    } 

    return strings; 
} 

Ideone Demo

+0

は、これは非常に便利ですが、私は、教育の目的は、(a)は、これは宿題の質問のように見える、と(b)のOPを作っているように表示されたときに役立ったかもしれないのだろうかどんな事前の努力もありません。彼らがこの解決策を提出すれば、何も学ばなかったかもしれない。 – halfer

+0

@halfer宿題に関する質問に答えるとき、私は常に良いコードがどのように見えるかを誰かに示すことが大きな利点であることを発見しました。私は彼らが今までに何か試みをしたかどうかを知る方法がないが、私の賭けは彼らが持っていることであり、まともな人間であり、実際にコードを読み、何かを理解しなければ質問する。 – 4castle

+0

@halferもちろん、私は宿題の問題は簡単に虐待されていることを認識しているので、アルゴリズムが合理的に複雑であれば答えを出すだけの努力をします。なぜなら、質問者が言語の妥当なレベルのスキルを持ち、これまでのところメリットに基づいて学校に行っています。私は人々を裁くためにここにはいません、私の知識を払うだけです。彼らが何かを学んだかどうかをテストするのは学校の仕事です。 – 4castle

0
public String[] allSwap(String[] strings) { 

    // map of first characters, and the index where they were last seen 
    Map<Character, Integer> map = new HashMap(); 

    for (int i = 0; i < strings.length; i++) { 


     char firstChar = strings[i].charAt(0); 
     // box charAt(0) 
     // remove firstChar from the map. If it's not found, returns null 
     Integer removedIndex = map.remove(firstChar); 

     if (removedIndex != null) { 
      int j = removedIndex; 
      // unbox potentialIndex 
      // swap values at thisIndex and thatIndex 
      String temp = strings[j]; 
      strings[j] = strings[i]; 
      strings[i] = temp; 
     } else { 
      // save the index for possible swapping later 
      map.put(firstChar, i); 
     } 
    } 

    return strings; 
} 
関連する問題