#javascript #arrays #algorithm
#javascript #массивы #алгоритм
Вопрос:
У меня есть функция Javascript, которая подсчитывает количество отсортированных чисел в заданном массиве. По какой-то причине это работает для всех положительных чисел, но когда массив содержит отрицательные числа, функция ведет себя так, как если бы отрицательные числа были положительными. Есть идеи о том, почему это происходит
countUniqueValues = (a) => {
if(a.length === 0){return 0;}
let i = 0;
let j = 1;
while(a[j]){
if(a[i] === a[j]){
j ;
}
else if(a[i] !== a[j]){
i ;
a[i] = a[j];
}
}
return i 1;
}
console.log(countUniqueValues([-2,-1,-1,0,1])); // return 2 and should return 4
Комментарии:
1.
a[i ];
ДА?….2. Ну
while(a[j])
, это остановится, когда он достигнет этого0
. Это похоже на немедленную ошибку.3. Если вы хотите выяснить, почему он возвращает 2, возьмите карандаш и бумагу и начните пошагово просматривать его. Или вы можете использовать отладчик вашего браузера.
4. Просто чтобы вы знали, это также не работает с некоторыми положительными наборами, например, я протестировал [2,4,5,6,5] .
5.
i
настраивается1
и устанавливаетсяa[1]
равным самому себе. Тогда все значения равны до техa[j]
пор, пока не завершится рано из-за0
. А затем1 1
приводит к2
Ответ №1:
Вы могли бы использовать a Set
, который дедуплицирует примитивные значения:
const countUniqueValues = arr => new Set(arr).size;
console.log(countUniqueValues([-2,-1,-1,0,1]));
Комментарии:
1. На самом деле это не отвечает на «Какие- либо идеи о том, почему это происходит «.
2. @Ivar Да, честно говоря, я не совсем понял, какова должна была быть идея кода в вопросе … на самом деле это не имеет смысла
Ответ №2:
let a = [-2,-1,-1,0,1];
var unique = a.filter(onlyUnique);
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
console.log(unique.length);
Это сработает!
Ваш не работает, потому что вы никогда не увеличиваете I или J