0
    String input = "AAAB";

    String output = "";
    for (int index = 0; index < input.length(); index++) {
        if (input.charAt(index % input.length()) != input
                .charAt((index + 1) % input.length())) {

            output += input.charAt(index);

        }
    }
    System.out.println(output);

しかし、入力が「ABABAB」または単に「AAAA」の場合は機能しません。何か案は?

4

5 に答える 5

4

などの文字が既に見つかっているかどうかを知るには、データ構造を使用しますSet。たとえば、そのadd()メソッドを使用して戻り値を確認できます。

また、StringBuilder反復連結に使用することを検討することもできます。これははるかに効率的です。

Set<Character> characters = new HashSet<Character>();
String input = "AAAB";
StringBuilder output = new StringBuilder();
for (int index = 0; index < input.length(); index++) {
    char character = input.charAt(index);
    if (characters.add(character)) {
        output.append(character);
    }
}
System.out.println(output.toString());
于 2012-12-13T18:23:11.283 に答える
1

スピード版に最適化

public static void main(String[] args) {
    String input = "AAAB";
    StringBuilder output = new StringBuilder();
    for (int i = 0; i < input.length(); i++) {
        if (!contains(output, input.charAt(i))) {
            output.append(input.charAt(i));
        }
    }
    System.out.println(output);
}

private static boolean contains(StringBuilder output, char c) {
    for(int i = 0; i < output.length();  i++) {
        if (output.charAt(i) == c) {
            return true;
        }
    }
    return false;
}
于 2012-12-13T18:47:37.830 に答える
0
public static void print(String s) {
    List<String> v = new ArrayList<String>();
    for(int j=0; j<s.length(); j++) {
        if(!v.contains("" + s.charAt(j)))
            v.add("" + s.charAt(j));
    }


    for(String e : v)
        System.out.print(e);
}
于 2012-12-13T18:54:22.500 に答える
0

(繰り返しではなく、重複を意味することを願っています。)

public static String withoutDuplicates(String s) {
    for (int i = 0; i < s.length(); ) {
        boolean removedDuplicate = false;
        for (int duplicateLength = (s.length() - i) / 2; duplicateLength >= 1; 
                --duplicateLength) {
            if (foundDuplicate(s, i, duplicateLength)) {
                s = s.substring(0, i) + s.substring(i + duplicateLength);
                removedDuplicate = true;
                break;
            }
        }
        if (!removedDuplicate) {
            ++i;
        }
    }
    return s;
}

private static boolean foundDuplicate(String s, int i, int duplicateLength) {
    String sought = s.substring(i, i + duplicateLength);
    return s.indexOf(sought, i + duplicateLength) != -1;
}

訂正: duplicateLength 初期化値が範囲外でした。

于 2012-12-13T18:45:38.070 に答える
0

あなたのループが何をしているか見てみましょう:

if (input.charAt(index % input.length()) != input
  .charAt((index + 1) % input.length()))

1) まず第一に、'% input.length()' 操作を実行することで時間と処理能力を浪費していることを認識する必要があります。 length() は常に index と等しくなります。

今後は %input.length() を無視しましょう。

2) input.charAt(index) を input.charAt(index+1) と比較すると、現在の文字と次の文字のみが比較されます。元の質問は、私が正しく理解している場合、隣り合って表示されるものだけでなく、すべての重複を削除するように求めています。

3) 文字列の末尾に到達すると (index == input.length() - 1 の場合)、input.charAt(index+1) をチェックすると、弦。

最初の回答が示唆したように、何らかの形式のデータ構造を利用して、遭遇したすべての DISTINCT 文字を格納する必要があります。新しい文字をヒットするたびに、a) データ構造に追加し、b) 出力の最後に追加する必要があります。

于 2012-12-13T18:49:29.540 に答える