我目前正在通过Cracking the Coding Interview工作,我正在寻找一些关于如何纠正此算法的建议。它似乎与某些测试用例有关,但它不适用于测试用例[' a' a' a' a' a''' ; b',' b',' b]作为输入。我有什么想法,我做错了什么?谢谢!
预期结果= [' a',' b']
实际结果= [' a']
/**
* Removes duplicate chars
*
* @param str
*/
public static void removeDuplicates(char[] str) {
if (str.length < 2) {
return;
}
for (int i = 0; i < str.length; i++) {
for (int j = 0; j < str.length; j++) {
if ((str[i] == str[j]) && (i != j)) {
str[j] = 0;
}
}
}
}
答案 0 :(得分:1)
尝试这样做:
public static void removeDuplicates(char[] str) {
if (str.length < 2) {
return;
}
for (int i = 0; i < str.length; i++) {
for (int j = 0; j < str.length; j++) {
System.out.println(i + "-" + j + " = " + str[j]); //added this line
if ((str[i] == str[j]) && (i != j)) {
str[j] = 0;
}
}
}
}
为什么我要告诉你这件事?这将向您展示删除过程的样子,并帮助您更好地理解问题。它实际上是正常的。
我不知道你是如何得到结果的,因为没有打印声明,和没有return
声明。但我确实找到了一种方法,可以不使用另一个char
数组(或任何数组)。它只是重建str
。看看:
public static void main(String[] args) {
char[] chr = {'a','a','b','c','b','a','b','c'};
System.out.println(removeDuplicates(chr));
}
public static char[] removeDuplicates(char[] str) {
if (str.length < 2) {
return null;
}
for (int i = 0; i < str.length; i++) {
for (int j = 0; j < str.length; j++) {
if ((str[i] == str[j]) && (i != j)) {
str[j] = 0;
}
if (i == (str.length-1)) {
str[i] = str[j];
}
}
}
return str;
}
此示例给出了输出:
abc
答案 1 :(得分:1)
考虑下一个(伪)代码:
if (str.length < 2) {
return;
}
good = 1; //current number of unique items
for (int i = 1; i < str.length; i++) {
success = 1;
//scan only unique items
for (int j = 0; j < good; j++) {
if ((str[i] == str[j]) {
success = 0;
break;
}
}
//new unique - copy at the final place
if (success) {
s[good] = str[i];
good++;
}
}
if (good<length)
str[good] = 0;