Испытания на хакерский ранг довольно просты. Одна повторяющаяся проблема - полное понимание постановки проблемы.
Как мы все знаем, первый шаг к решению проблемы - это сначала выявить проблему.
Взглянем на вызов (вот ссылка):
В описании функции serviceLane нам даны два параметра: n и case.
Пример ввода
8 5
2 3 1 2 3 2 3 3
0 3
4 6
6 7
3 5
0 7
что переводится как:
n, t. n = width.length = 8, t = cases.length = 5. width = [2, 3, 1, 2, 3, 2, 3, 3].
t lines = cases = [[0, 3],[4, 6],[6, 7],[3, 5], [0, 7]].
i j i j i j i j i j
Каждый отдельный массив в массиве случаев представляет точки входа и выхода, называемые i и j, также называемые тестовыми примерами.
Но в функции serviceLane у нас всего два параметра: n (width.length) и case.
Объяснение:
Используя i и j в качестве индексов для диапазона чисел из массива ширины,
[0,3] из массива case дает нам это подмножество массива ширины: [2,3,1,2]
[4,6] из массива case дает нам это подмножество массива ширины: [3,2,3 ]
[6,7] из массива случаев дает нам это подмножество массива ширины: [3,3]
[3,5] из массива случаев дает нам это подмножество массива ширины: [2,3,2]
[0,7] из массива случаев дает нам это подмножество массива ширины: [2,3,1,2,3,2,3,3]
Решая алгоритмические задачи, мы всегда должны искать закономерность.
Здесь модель состоит в том, что автомобиль максимального размера, проезжающий через каждый из этих сегментов дороги, является минимальным числом в каждом из подмножеств массива ширины. Функция должна возвращать массив автомобилей минимального размера из каждого подмножества.
Учитывая мое решение:
// Complete the serviceLane function below. function serviceLane(n, cases) { //1.Get an array of arrays of road segments slicing at the entry(i) and exit(j) points.(subsets of width array). let slicedWidths = []; for(let i = 0; i < t; i++){ let unit = cases[i]; let widthSlice = width.slice(unit[0], unit[1]+1); slicedWidths.push(widthSlice); } //2.Get an array of Maximum car widths that can pass through each road segment. let maxWidthsOfVehicle = []; for (let g = 0; g < slicedWidths.length; g++){ maxWidthsOfVehicle.push(Math.min(...slicedWidths[g])); } return maxWidthsOfVehicle; } //reference error: width is undefined, t is undefined
Он возвращает справочную ошибку, в которой говорится, что ширина не определена.
Это не сработало, пока я не просмотрел код Hackerrank, который выполняет эту функцию. и нашел это:
function main() { const ws = fs.createWriteStream(process.env.OUTPUT_PATH); const nt = readLine().split(‘ ‘); const n = parseInt(nt[0], 10); const t = parseInt(nt[1], 10); const width = readLine().split(‘ ‘).map(widthTemp => parseInt(widthTemp, 10)); let cases = Array(t); for (let i = 0; i < t; i++) { cases[i] = readLine().split(‘ ‘).map(casesTemp => parseInt(casesTemp, 10)); } let result = serviceLane(n, cases); ws.write(result.join(“\n”) + “\n”); ws.end(); }
Параметр ширины намеренно не был включен в качестве параметра и аргумента при вызове функции и объявлении функции. Это просто уловка.
Глядя на переменную результата в коде Hackerrank (из последнего фрагмента кода), который выполняет функцию, мы имеем:
let result = serviceLane(n, cases);
поэтому я исправил переменную результата:
let result = serviceLane(n, t, width, cases);
а также изменил его в объявлении функции:
function serviceLane(n, t, width, cases) {}
и это творило чудо:
// Complete the serviceLane function below. function serviceLane(n, t, width, cases) { //1.Get an array of arrays of road segments slicing at the entry(i) and exit(j) points.(subsets of width array). let slicedWidths = []; for(let i = 0; i < t; i++){ let unit = cases[i]; let widthSlice = width.slice(unit[0], unit[1]+1); slicedWidths.push(widthSlice); } //2.Get an array of maximum car widths that can pass through each road segment. let maxWidthsOfVehicle = []; for (let g = 0; g < slicedWidths.length; g++){ maxWidthsOfVehicle.push(Math.min(...slicedWidths[g])); } return maxWidthsOfVehicle; } // [1,2,3,2,1]
Иногда вам нужно будет просмотреть код Hackerrank, который выполняет функцию после многих попыток и проверок. Это часть проблемы.
Рефакторинг кода (аккуратный и эффективный):
В трех (3) строках кода,
// Complete the serviceLane function below. function serviceLane(n, t, width, cases) { //1.Get an array of arrays of road segments slicing at the entry(i) and exit(j) points.(subsets of width array). let slicedWidths = cases.map(s=>width.slice(s[0], s[1]+1)); //2.Get an array of maximum car widths that can pass through each road segment. let maxWidthsOfVehicle = slicedWidths.map(b=>Math.min(...b)); return maxWidthsOfVehicle; } // [1,2,3,2,1]
Для большего понимания встроенных методов .map и .filter es6 + javascript, просмотрите эти ссылки:
Надеюсь, вы действительно это поняли. Сообщите мне свои мысли и комментарии в разделе обзора
Ваше здоровье.