5

私のコードは期待される出力を提供しませんが、ドライランは正常に機能します。問題がどこにあるかを見てください。

public static StringBuffer singleOccurence(String s)
{
 StringBuffer sb = new StringBuffer(s);
 int length=s.length();


 for(int i=0; i< length ; i++)
 {
  for(int j=i; i<length&&j<length ; j++)
  {
    if(sb.charAt(i)!=sb.charAt(j+1)) 
         i=j+1;
    else
    sb.deleteCharAt(j+1);
   } 
 }

 return sb;
}

StringIndexOutOfBoundsも提供します

4

9 に答える 9

5

あなたの方法は多くの不必要な仕事をしています。

この問題は、文字列を1回繰り返し、各文字をその前の文字と比較することで解決できます。

public static StringBuilder singleOccurence(String s)
{
    StringBuilder sb = new StringBuilder();
    if (s.length() > 0) {
        char prev = s.charAt(0);
        sb.append(prev);
        for (int i = 1; i < s.length(); ++i) {
            char cur = s.charAt(i);
            if (cur != prev) {
                sb.append(cur);
                prev = cur;
            }
        }
    }
    return sb;
}

この方法は線形の時間計算量を持っています。

于 2013-03-26T11:20:09.493 に答える
4

私は正規表現を使用します:

String input = "aaaabbbccdbbaae";
String regex = "(.)(\\1)+"; // matches any character followed by the same one(s)
String output = input.replaceAll(regex, "$1");
System.out.println(output); // abcdbae

あなたの方法は次のようになります:

public static String singleOccurence(String s) {
    return s.replaceAll("(.)(\\1)+", "$1");
}
于 2013-03-26T11:16:10.077 に答える
2

最も簡単な方法は、文字列を最後から最初までトラバースすることです。

public static StringBuffer singleOccurence(String s)
{
    StringBuffer sb = new StringBuffer(s);        
    for (int i = sb.length() - 2; i >= 0; i--)
        if (sb.charAt(i) == sb.charAt(i + 1))
             sb.deleteCharAt(i + 1);
    return sb;
}
于 2013-03-26T11:24:45.053 に答える
1

私にはネガティブな先読みのように聞こえます:

 String input = "aaaaabbbbccccddd";
    Pattern p = Pattern.compile("(.)(?!\\1)");
    Matcher m = p.matcher(input);

    while(m.find()){
        System.out.println(m.group(1));
    }
于 2013-03-26T11:19:52.077 に答える
0

これを試して:

    String reg;
    String input;
    String output;
    reg    = "(.)(\\1)+";
    input  = "aaaabbbccdbbaae";
    output = input.replaceAll(reg,"$1");
    System.out.println("Input :"+input);
    System.out.println("Output:"+output);
于 2013-08-06T09:33:49.230 に答える
0

あなたはreplaceAllでメソッドを使用することができますregex

string result = myString.replaceAll(/([a-z])\1+/ig, "$1");

これが行うことは、パーツによってトリガーされる繰り返されるregexすべてのアルファ文字と一致することです[a-z]\1+

正規表現(最後の後/)のフラグは、文字列全体(gフラグ)を検索し、大文字と小文字(フラグ)を無視する必要があることを示しますigここではを使用しているため、フラグは必要ない場合がありますreplaceAll

ここでは$1、最初に一致したグループに置き換えます。[a-z]の周りに括弧$1があるので、一致する文字になります。

これはすべて、大文字と小文字を無視して文字列内で繰り返される文字を見つけ、それらをその文字に置き換えることを意味します。

于 2015-04-07T01:47:50.073 に答える
0

パブリッククラスRemoveAdjacentLetters{

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Enter any word: "); // Inputting the word
    String str = scanner.nextLine();
    for (int i = 1; i < str.length(); i++) { // from 2nd letter
        if (str.charAt(i) == str.charAt(i - 1)) { // comparing adjacent
                                                    // letters

            str = str.substring(0, i - 1) + str.substring(i + 1); // eliminating
                                                                    // 1st
                                                                    // duplicates
            System.out.println(str);
            i = 0;                // i=0 because I need to check for all possible adjacent letters.. 

        }
    }
    if (str.length() == 0) {
        System.out.println("Empty String");
    } 
    scanner.close();
}

}

于 2017-03-14T12:59:38.313 に答える
0

java.util.Arraysをインポートします。java.util.Scannerをインポートします。

パブリッククラスReverseSkip{

public static void main(String[] args) {
    String str;
    Scanner in = new Scanner(System.in);
    System.out.println("Enter the Word or Sentence");
    str =in.nextLine();
    String revStr ="null";

    char [] chars = str.toCharArray();
    char [] reversedChars = new char[chars.length];

    reversedChars[reversedChars.length - 1] = chars[0];


    int r = reversedChars.length - 2;
    for(int i = 1 ; i < chars.length ; i++ ){
        if(chars[i] != chars[i-1]){
            reversedChars[r] = chars[i];
            r--;
        }
    }

    revStr = new String(Arrays.copyOfRange(reversedChars, r+1, reversedChars.length));

    System.out.println(revStr);
}

}

于 2017-09-06T07:48:52.993 に答える
0

これはJavaで簡単に解決できます。StringBufferを取る必要があります。これは完全なコードです:

public class Test3 {
public static void main(String[] args) {
    String str = "aaaabbbccdbbaae";
    StringBuffer sbr = new StringBuffer();
    int i = 0 ;
    while(i < str.length()) {
        if(sbr.length() == 0 ) sbr.append(str.charAt(i));
        if(str.charAt(i) == sbr.charAt(sbr.length() -1)) {i++ ;}
        else {sbr.append(str.charAt(i)); i++;}
    }//while
System.out.println(sbr);
}

}//end1

これはPythonの完全なソリューションです:(異なるアイデア)

def lis(a):
    list1 = [] 
    # put the characters in the list
    [list1.append(ch)  for ch in a]
    print(list1)
    # moving backwards from last element i.e.len(a) -1 to first element 0 and step is -1
    for i in range(len(list1) - 1 , 0 , -1):
        # delete the repeated element
        if list1[i] == list1[i - 1]: del list1[i]

    return ''.join(list1)    


a = "Protiijaayii"
# output Protijayi
print(lis(a))
于 2018-04-20T16:49:25.407 に答える