javascript функция для поиска второго по величине элемента в массиве - PullRequest
0 голосов
/ 28 мая 2020

Я завершаю 10-дневное испытание javascript хакерранка. Вопрос:

напишите функцию, которая принимает массив в качестве аргумента, а затем возвращает второй по величине элемент в массиве.

Я написал код, но мой код возвращает самый большой элемент, а не второй по величине, как просили.

function getSecondLargest(nums) {
    // Complete the function
    var largest=nums[0];
    for(let i=1;i<nums.length;++i)
    {
        if(nums[i]>largest)
        largest=nums[i];
    }
    var large=nums[0];
    for(let j=1;j<nums.length;++j)
    {
        if(large<nums[j]&&large<largest)
        large=nums[j];
    }
    return large;
}

При входном массиве nums={2,3,6,6,5} приходит результат 6, а ожидаемый результат равен 5. Пожалуйста, помогите и укажите на ошибки в код функции ниже.

Ответы [ 5 ]

1 голос
/ 16 августа 2020

ПОЛУЧИТЬ ВТОРОЙ КРУПНЕЙШИЙ

первый , я создаю новый массив с уникальными значениями.

let arr = [...new Set(nums)];

секунда , значение сортировки с использованием встроенной функции .sort().

примечание: по умолчанию .sort() всегда сортирует асцибетически, но для некоторых тестов это не так работай. Итак, я поставил (a, b) => { return a - b }, чтобы убедиться, что он будет работать правильно.

arr = arr.sort((a, b) => { return a -b });

третий , получите значение из arr

let result = arr[arr.length - 2] || arr[0];

наконец , вернуть результат

return result

function getSecondLargest(nums) {
  let arr = [...new Set(nums)];

  //Javascript's array member method .sort( always sorts asciibetically.
  arr = arr.sort((a, b) => { return a - b });
  let result = arr[arr.length - 2] || arr[0];
  return result
}
1 голос
/ 28 мая 2020

Всего одно небольшое изменение:

Используйте nums[j]<largest вместо large<largest во втором для l oop

function getSecondLargest(nums) {
    // Complete the function
    var largest=nums[0];
    for(let i=1;i<nums.length;++i)
    {
        if(nums[i]>largest)
        largest=nums[i];
    }
    var large;
    
    //To ensure that the selected number is not the largest
    for(let j=0;j<nums.length;++j)
    {
        if (nums[j] !== largest){
            large = nums[j];
            break;
        }
    }
    for(let j=1;j<nums.length;++j)
    {
        if(large<nums[j]&&nums[j]!=largest)
            large=nums[j];
        else
            
        console.log(large)
    }
    return large;
}

var secondLargest = getSecondLargest([6,3,6,6,5]);
console.log("Second largest number", secondLargest);
0 голосов
/ 28 мая 2020

Другой простой способ c - удалить дубликаты из массива и отсортировать.

let givenArray = [2, 3, 6, 6, 5];
let uniqueArray = [...new Set(givenArray)];

console.log("The second largets element is", uniqueArray.sort()[uniqueArray.length - 2]);
0 голосов
/ 28 мая 2020
  • не следует инициализировать large первым значением var large=nums[0];, потому что оно может оказаться самым большим значением и не будет работать
  • следует использовать nums[j]<largest instead of large<largest, как указано выше
  • Я думаю, что не нужен второй l oop, так как все проверки могут быть выполнены в первом l oop, и вы можете назначить предыдущий наибольший на большой всякий раз, когда вы его меняете:

function getSecondLargest(nums) {
  var largest = nums[0];
  var large;
  for (let i = 1; i < nums.length; ++i) {
    if (nums[i] > largest) {
        large = largest;
        largest = nums[i];
    } else if (nums[i] > large || typeof large === 'undefined') {
        large = nums[i]
    }
  }
  return large;
}
console.log(getSecondLargest([5,1-2,3]))
console.log(getSecondLargest([-5,1,-2,3]))
0 голосов
/ 28 мая 2020

Если вы хотите избежать использования библиотечных функций, таких как @ifaruki, эта строка

if(large<nums[j]&&large<largest)

должна читать

if (large<nums[j] && nums[j] < largest)

Сортировка и выбор второго или предпоследнего значения завершается ошибкой, если во входном массиве есть дубликаты самого высокого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...