我正在查看破解编码书中的“编写代码以删除字符串中的重复字符而不使用任何其他缓冲区”的问题。
我已经用书中的解决方案编写了一个程序:
public class test {
public static void main(String[] args) {
String str = "aaabbb";
char[] charArray = str.toCharArray();
System.out.println(charArray);
remove_V(charArray);
System.out.println(charArray);
}
public static void remove_V(char[] str) {
if (str == null) return;
int len = str.length;
if (len < 2) return;
int tail = 1;
for (int i = 1; i < len; ++i) {
int j;
for (j = 0; j < tail; ++j) {
if (str[i] == str[j]) break;
}
if (j == tail) {
str[tail] = str[i];
++tail;
}
}
str[tail] = 0;
}
}
我用“aaabbb”测试了程序,但我得到的输出是“abbb”。这是否意味着程序错了?
答案 0 :(得分:0)
问题是remove_V方法的最后一个命令。您正在使用&#39; 0&#39;只是str数组的最后一个位置由tail的最后一个值决定。实际上,有必要清理所有尾部位置,i。例如,从对应于尾部的最后一个值的位置到通过str数组(len-1)的最后一个位置。所以,改变
str[tail] = 0;
这样的事情
for (int i = tail; i < len; ++i)
str[i] = 0;
答案 1 :(得分:0)
在这种情况下,你可以使用java charAt()
和一个for循环,你不需要两个for循环和if块。
你需要用两件事来简化逻辑。 一个前一个值 - 将前一个char存储在其中 if to block to存储不等于前一个char的char值。
public static void main(String[] args) {
String str = "aaabbb";
String str2 = "aaabbkkbmoouse";
System.out.println(remDup(str));
System.out.println(remDup(str2));
}
public static String remDup(String str){
String res = ""; // final resulting groups of chars
char prev = '-';
for(int i = 0; i < str.length(); i++){
if (str.charAt(i) != prev) { // not equal to previous to store to previous and add to results.
prev = str.charAt(i);
res += prev;
}
}
return res;
}
输出
str:ab
str2:abkbmouse