В Java массивы имеют фиксированный размер. Таким образом, вызываемая функция не может изменить размер входного массива, если найдет дубликаты. Ваша функция просто создает начальный индекс подмассива, который имеет дубликаты до 0
. Поэтому, когда вы печатаете содержимое массива в вызывающей функции, элемент, который был сделан 0
, не печатается, а элементы, следующие за ним (если есть), действительно печатаются.
Ответ YoK превращает все элементы подмассива, которые являются дубликатами, в 0. Таким образом, когда вы печатаете его в вызывающей функции, дубликаты не печатаются. Но вы должны помнить, что размер массива остается неизменным.
В качестве альтернативы вы можете вернуть размер подмассива с уникальными символами. Который в вашем случае это tail
.
Еще одна альтернатива - передать ввод как StringBuffer
и внести изменения на месте как:
public static void removeDuplicates(StringBuffer str) {
int len = str.length();
// if the string as less than 2 char then it can't have duplicates.
if (len < 2) {
return;
}
// fist character will never be duplicate.
// tail is the index of the next unique character.
int tail = 1;
// iterate from 2nd character.
for (int i = 1; i < len; ++i) {
int j;
// is char at index i already in my list of uniq char?
for (j = 0; j < tail; ++j) {
if (str.charAt(i) == str.charAt(j)) {
break;
}
}
// if no then add it to my uniq char list.
if (j == tail) {
str.setCharAt(tail, str.charAt(i));
// increment tail as we just added a new ele.
++tail;
}
}
// at this point the characters from index [0,tail) are unique
// if there were any duplicates they are between [tail,input.length)
// so truncate the length of input to tail.
str.setLength(tail);
}
Ideone Link