Испытания на хакерский ранг довольно просты. Одна повторяющаяся проблема - полное понимание постановки проблемы.

Как мы все знаем, первый шаг к решению проблемы - это сначала выявить проблему.

Взглянем на вызов (вот ссылка):



В описании функции 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, просмотрите эти ссылки:









Надеюсь, вы действительно это поняли. Сообщите мне свои мысли и комментарии в разделе обзора

Ваше здоровье.