В следующем коде (из «Интервью по взлому кода» от Gaale Laakman) показано, как удалить повторяющиеся символы в массиве 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;
}