#arrays #algorithm #pseudocode
#массивы #алгоритм #псевдокод
Вопрос:
я пытаюсь написать алгоритм, который удалит любой повторяющийся элемент из массива, переданного в качестве параметра. я изо всех сил пытался сделать это только с использованием массива в качестве параметра, поэтому я добавил еще один параметр, который будет размером массива.
я хочу, чтобы алгоритм удалял повторяющиеся элементы и возвращал массив с неповторяющимися элементами.
вот что я написал
Algorithm RemDup(arr[0..n-1],k)
j<--0
m<--0
for i<--0 to i<k do
for j<--i 1 to j<k do
if arr[i]=arr[j]then
for m=j to m<k do
arr[m] = arr[m 1]
endfor
k<-- k-1
j<-- j-1
endif
endfor
endfor
return arr
это правильный метод? и есть ли способ создать этот алгоритм, используя только массив, переданный в качестве параметра?
Комментарии:
1. Кажется правильным, хотя и не очень эффективным, его можно было бы значительно улучшить. Есть только одна ошибка: длина самого массива не уменьшается (только k), если вы находите дубликаты.
Ответ №1:
Если вы хотите удалить длину массива ‘k’ из параметра функции, вы можете прочитать длину массива внутри функции и присвоить ей значение ‘k’. Ваш алгоритм хорошо подходит для несортированного массива. Если это для отсортированного массива, вы можете удалить один цикл из своего алгоритма, как показано ниже. В приведенном ниже алгоритме я использовал тот же входной массив для хранения конечного результата. Таким образом, возвращая конечное значение индекса ‘j’ выходного массива (после удаления дубликатов).
Обратитесь к этой ссылке для подробного анализа: https://www.geeksforgeeks.org/remove-duplicates-sorted-array /
Algorithm RemDup(arr[0..n-1])
k<--arr.length
j<--0
for i<--0 to i<k do
if arr[i]!=arr[i 1]then
arr[j] = arr[i]
j<--j 1
end if
endfor
// Сохраните последний элемент как уникальный или повторяющийся, он ранее не сохранялся
arr[j] = arr[n-1];
return arr,j
Надеюсь, это поможет вашему вопросу.
Ответ №2:
В JavaScript распространенный способ удаления дубликатов заключается в следующем:
console.log(
[1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]
.filter((v, i, arr) => arr.indexOf(v) === i)
);
Здесь вы перебираете массив, чтобы найти самое первое совпадение. Если его позиция не совпадает с позицией текущего элемента, то он должен быть дубликатом, и вы его игнорируете. В псевдокоде:
Algorithm RemDup(arr[0..n-1],k)
i<--0
m<--0
while i<k do
skip<--false
for j<--0 to j<i do
if arr[i]=arr[j]then
skip<--true
break
endif
endfor
if skip do
for m=i to m<k do
arr[m] = arr[m 1]
endfor
k<--k-1
else
i<--i 1
endif
endfor
return arr