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

你的方法做了很多不必要的工作。

该问题可以通过遍历字符串一次并将每个字符与其前面的字符进行比较来解决:

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+

正则表达式中的标志(在 last 之后/)表明它应该搜索整个字符串(g标志)并且应该忽略大小写(i标志)。您可能不需要该g标志,因为我们在这里使用replaceAll.

在这里,我们替换为$1which 表示,替换为第一个匹配的组。因为我们在 周围有括号[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 中很容易解决。你只需要一个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 回答
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 回答