Информация об изменениях

Сообщение Re: Как собеседовать джуниоров от 11.03.2022 4:50

Изменено 11.03.2022 4:50 Lazytech

Re: Как собеседовать джуниоров
Здравствуйте, vsb, Вы писали:

vsb>На собеседованиях я сейчас первым делом даю задачу — написать на JS функцию isPalyndromic(n) — проверить, является ли число палиндромом в десятичной записи. Предполагаемое решение — преобразовать число в строку и сравнить символы. Ожидается, что кандидат знает основы JS (как число в строку преобразовать), умеет писать хоть какой-то код, умеет писать циклы, понимает, что такое массивы. Ну и вообще умеет читать формально поставленную задачу и преобразовать её в программный код. Мой идеальный джуниор должен построить m без преобразования в строку (перевернутая n) и вернуть return n === m (эффективное и с какой-то точки зрения изящное алгоритмически решение без выделения лишней памяти). <...>


При наличии запрета на преобразование числа в строку решение вполне себе тривиальное, хотя one-liner'ом, наверное, уже не обойтись. Ниже привожу свое громоздкое решение на JavaScript.
function getNumDigits(num) {
    let num2 = num;
    let count = 0;
    
    while (num2 > 0) {
        num2 = Math.floor(num2 / 10);
        count++;
    }
    
    return count;
}

function isPalyndrome(n, m) {
    console.log('=========================================');
    console.log('n =', n);
    console.log('m =', m);
    const numDigitsN = getNumDigits(n);
    const numDigitsM = getNumDigits(m);
    
    if (numDigitsN !== numDigitsM) {
        console.log('The two numbers are of different length.');
        return false;
    }
    
    let n2 = n;
    let m2 = m;
    
    // n - from right to left
    // m - from left to right
    
    let n3;
    let nDigit;
    
    let m3;
    let mDigit;
    
    let divisor = 10 ** (numDigitsM - 1);
    // console.log('divisor =', divisor);
    
    for (let i = 0; i < numDigitsN; i++) {
        n3 = Math.floor(n2 / 10);        
        nDigit = n2 - 10 * n3;
        console.log('nDigit =', nDigit);
        
        mDigit = Math.floor(m2 / divisor);
        console.log('mDigit =', mDigit);
        
        if (nDigit !== mDigit) {
            console.log('The two digits are not equal.');
            return false;
        }
        
        m2 -= mDigit * divisor;
        divisor /= 10;

        n2 = n3;
    }
    
    console.log('It is a palyndrome indeed!');    
    return true;
}

console.log(isPalyndrome(1352, 2531)); // true
console.log(isPalyndrome(999, 998)); // false
console.log(isPalyndrome(1, 2)); // false
console.log(isPalyndrome(12345, 54321)); // true
Re: Как собеседовать джуниоров
Здравствуйте, vsb, Вы писали:

vsb>На собеседованиях я сейчас первым делом даю задачу — написать на JS функцию isPalyndromic(n) — проверить, является ли число палиндромом в десятичной записи. Предполагаемое решение — преобразовать число в строку и сравнить символы. Ожидается, что кандидат знает основы JS (как число в строку преобразовать), умеет писать хоть какой-то код, умеет писать циклы, понимает, что такое массивы. Ну и вообще умеет читать формально поставленную задачу и преобразовать её в программный код. Мой идеальный джуниор должен построить m без преобразования в строку (перевернутая n) и вернуть return n === m (эффективное и с какой-то точки зрения изящное алгоритмически решение без выделения лишней памяти). <...>


При наличии запрета на преобразование числа в строку решение вполне себе тривиальное, хотя one-liner'ом, наверное, уже не обойтись. Ниже привожу свое громоздкое решение.
  JavaScript Inside
function getNumDigits(num) {
    let num2 = num;
    let count = 0;
    
    while (num2 > 0) {
        num2 = Math.floor(num2 / 10);
        count++;
    }
    
    return count;
}

function isPalyndrome(n, m) {
    console.log('=========================================');
    console.log('n =', n);
    console.log('m =', m);
    const numDigitsN = getNumDigits(n);
    const numDigitsM = getNumDigits(m);
    
    if (numDigitsN !== numDigitsM) {
        console.log('The two numbers are of different length.');
        return false;
    }
    
    let n2 = n;
    let m2 = m;
    
    // n - from right to left
    // m - from left to right
    
    let n3;
    let nDigit;
    
    let m3;
    let mDigit;
    
    let divisor = 10 ** (numDigitsM - 1);
    // console.log('divisor =', divisor);
    
    for (let i = 0; i < numDigitsN; i++) {
        n3 = Math.floor(n2 / 10);        
        nDigit = n2 - 10 * n3;
        console.log('nDigit =', nDigit);
        
        mDigit = Math.floor(m2 / divisor);
        console.log('mDigit =', mDigit);
        
        if (nDigit !== mDigit) {
            console.log('The two digits are not equal.');
            return false;
        }
        
        m2 -= mDigit * divisor;
        divisor /= 10;

        n2 = n3;
    }
    
    console.log('It is a palyndrome indeed!');    
    return true;
}

console.log(isPalyndrome(1352, 2531)); // true
console.log(isPalyndrome(999, 998)); // false
console.log(isPalyndrome(1, 2)); // false
console.log(isPalyndrome(12345, 54321)); // true