0

以下代码(来自 Gaale Laakman 的“Cracking the code interview”)展示了如何在不使用数组副本的情况下删除 char 数组中的重复字符以避免一些额外的内存使用。它用偏移量重新写入第一个数组中的最后一个字符。由于最后的数组比前一个小,所以在最后一个字符之后的位置设置了一个空字符,就好像数组停在那里一样:

    str[tail] = 0;

我想知道这样做是否会改变数组的变量“长度”。如果没有,我不明白为什么这个例子有效。或者这只是一个示例,我们将检查空字符在哪里以查找数组的长度并且不使用有问题的长度变量?

这是整个代码:

    public static void removeDuplicates(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;
    }
4

3 回答 3

3

这听起来像是一个从 C 或 C++ 翻译而来的问题。在这些语言中,您使用空字符作为字符串的结尾(它又是一个char数组)。在 Java 中这是行不通的;数组永远不会改变它的长度。

如果调用者知道插入了这个空字符,他们当然可以使用该信息,而忽略空字符之后的字符。他们不能使用该len变量,因为它只存在于方法内部,并且在方法返回时不存在。

在 Java 中,你通常会这样做:

str = Arrays.copyOf(str, tail);

这将创建一个长度正确的新数组并复制所有字符(这是代码示例旨在避免的)。

顺便说一句,如果没有找到重复项,我最后会得到一个ArrayIndexOutOfBoundsExceptionstr[tail] = 0;在这种情况下tail,等于数组的长度,因此比最后一个元素高 1 个位置。

于 2017-03-01T11:40:36.277 回答
2

数组在创建时具有固定长度。在示例中,他们希望通过始终为每次迭代重复使用相同的数组来节省一些时间。由于不可能缩小数组(因为长度是在创建时确定的),所以他们使用了一种解决方法,他们在数组应该结束的地方放了一个零。当他们的循环到达零时,它知道它位于数组的概念“末端”。

于 2017-03-01T11:21:10.287 回答
1

数组是不可变的,因此长度不会改变 空白空间填充空值

public class MainClass {

public static void main(String[] args) {
char[] org={'a','b','b','c'};
System.out.println(org.length);
System.out.println(org);
removeDuplicate(org);
System.out.println(org.length);
   System.out.println(org);

}
public static void removeDuplicate(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;
  }
 }

**Results**
   4
  abbc
   4
  abc
于 2017-03-01T11:34:20.253 回答