删除重复的字符而不使用额外的数组

时间:2017-07-03 04:36:34

标签: java arrays algorithm char duplicates

我目前正在通过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;
            }
        }
    }
}

2 个答案:

答案 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;