Как отсортировать 2d для цикла и ввести результаты в формулу гипотенузы - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь перебрать список координат и определить их расстояние до начала координат (0,0).Например, массив пар [[1,3],[-2,2]] должен дать 3.162 и 2.828 соответственно как результат.

Я создал двумерный цикл для извлечения каждой координаты.Затем я вызвал функцию calcHypotenuse() для возведения в квадрат чисел и сложения их для получения расстояний.

Однако, когда я нажимаю результаты каждой гипотенузы и возвращаю их, я получаю смешанный результат.Я получаю 4.52 и 2.82.По какой-то причине 2.82 является правильным выходом для второй пары координат, но первая пара координат не является.

ПРИМЕЧАНИЕ. Пожалуйста, отклоните k.Это не имеет отношения к проблеме определения расстояния до источника.

function kClosest(points, k) {
    let length = [];
    let a = 0;
    let b = 0;

    for (let i = 0; i < points.length; i++) {
        for (let j = 0; j < points.length; j++) {
            a = points[i][j] * points[i][j];
            b = points[i][j + 1] * points[i][j + 1];
            console.log('Squared Cordinates: (' + a + ',' + b + ')')
            length.push(parseFloat(calcHypotenuse(a / 2, b / 2).toFixed(4)))
            break;
        }
    }

    function calcHypotenuse(a, b) {
        return (Math.sqrt((a * a) + (b * b)));
    }
    return length;
}



console.log(kClosest([
    [1, 3],
    [-2, 2]
], K = 1));

Эта проблема является производной от Leet Code: https://leetcode.com/problems/k-closest-points-to-origin/

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Игнорируя k, как вы говорите, вы можете легко получить расстояния до источника (0,0), используя map () :

map () метод создает новый массив с результатами вызова предоставленной функции для каждого элемента в вызывающем массиве.

function calcHypotenuse(a, b)
{
    let hyp = Math.sqrt(Math.pow(a,2) + Math.pow(b,2));
    return Number.parseFloat(hyp.toFixed(4));
}

function getDistancesTo(points, pair)
{
    let [x0, y0] = pair;
    return points.map(([x, y]) => calcHypotenuse(x - x0,y - y0));
}

console.log(getDistancesTo([[1, 3], [-2, 2]], [0, 0]));

Я также использую деструктурирование , чтобы сказать, что элементом массива является пара [x,y].Но, может быть, вы поймете это лучше так:

function getDistances(points, pair)
{
    let x0 = pair[0], y0 = pair[1];
    return points.map(p => calcHypotenuse(p[0] - x0, p[1] - y0));
}
0 голосов
/ 05 февраля 2019

Вы возводите в квадрат координаты, а затем делите результат на 2, прежде чем поместить его в функцию гипотенузы.Кроме того, в этом случае вам не нужен двойной цикл for, поскольку вы перебираете каждую подмассиву / пару один раз.То, что я предложил бы сделать, это просто создать один цикл, который повторяет каждую пару, и поместить каждую пару координат в функцию гипотенузы, например,

function kClosest(points, k) {
    let length = [];
    let a = 0;
    let b = 0;

    for (let i = 0; i < points.length; i++) {
        a = points[i][0];
        b = points[i][1];
        length.push(parseFloat(calcHypotenuse(a, b).toFixed(4)))
    }

    function calcHypotenuse(a, b) {
        return (Math.sqrt((a * a) + (b * b)));
    }
    return length;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...