Оптимизация и поиск крайних случаев, которые я мог пропустить - 2 кодовых вопроса для интервью - PullRequest
1 голос
/ 28 марта 2020

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

Вопросы практического теста -

Задача: Учитывая целое число, введите в него число 5, чтобы получить максимально возможное целое число Условия: (-80000 ... 80000) диапазон необходимо обработать
Ожидаемый ввод: int
Ожидаемый вывод: int
Тестовый случай: -999 -> -5999
80 -> 850

var lrgInt = function(num) {
    var stringInt = num.toString();
    for (let i = 0; i < stringInt.length; i++) {
        if (stringInt.charAt(i) === "-") {
            return parseInt([stringInt.slice(0, 1), '5', stringInt.slice(1)].join(''));
        }else if (stringInt.charAt(i) < 5) {
             return parseInt([stringInt.slice(0, i), '5', stringInt.slice(i)].join(''));
        }
    }
    return parseInt([stringInt.slice(0, stringInt.length), '5', stringInt.slice(stringInt.length)].join(''));
};

Задача: Определить число операции, выполняемые с числом, следуя условиям, чтобы уменьшить его до 0.
Условия:
- Если число нечетное, вычтите 1
- Если число четное, разделите на 2
Ожидаемый ввод: int
Ожидаемый результат: int

var operations = 0;

var numberOfSteps  = function(num) {
    if (num === 0){
        return operations;
    }else if (num % 2 == 0) {
        operations++;
        return numberOfSteps(num/2);
    } else {
        operations++;
        return numberOfSteps(num-1);
    }
};

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

По первому вопросу мы делаем замечание, что если число положительное, мы хотим ввести 5 до первого di git меньше 5, но если оно отрицательное, мы хотим ввести его до первого di git больше 5. Для второй задачи мы можем просто использовать простое время, пока l oop.

function largestNum(num) {
    if (num == 0) {
        // this edge case is weird but I'm assuming this is what they want
        return 50;
    }
    var negative = num < 0;
    var numAsStr = Math.abs(num).toString();
    var inj = -1;
    for (var i = 0; i < numAsStr.length; i++) {
        var cur = parseInt(numAsStr[i], 10);
        if ((!negative && cur < 5) || (negative && cur > 5)) {
            // we found a place to inject, break
            inj = i;
            break;
        }
    }
    if (inj == -1) {
        // didn't inject anywhere so inject at the end
        inj = numAsStr.length;
    }
    return (
        (negative ? -1 : 1) *
        parseInt(numAsStr.substr(0, inj) + "5" + numAsStr.substr(inj))
    );
}

function numSteps(num) {
    var steps = 0;
    while (num != 0) {
        if (num % 2) {
            // it's odd
            num--;
        } else {
            num /= 2;
        }
        steps++;
    }
    return steps;
}
2 голосов
/ 28 марта 2020

Для второго вопроса вы можете добавить один плюс результат рекурсии с откорректированным числом без глобального счетчика.

function numberOfSteps(number) {
    if (!number) return 0;
    if (number % 2) return 1 + numberOfSteps(number - 1);
    return 1 + numberOfSteps(number / 2);    
}

console.log(numberOfSteps(5)); // 5 4 2 1 0
...