Каждый день я решаю несколько задач по программированию и головоломок из рейтингового режима Codr. Цель - достичь звания гения, попутно объясняю, как их решаю. Для начала вам не нужен опыт программирования, и вы узнаете массу нового и интересного по ходу дела.
function numDecodings(s) { if (s == null || s.length == 0) { return 0; } const dp = Array(s.length + 1).fill(0); dp[0] = 1; dp[1] = s[0] !== '0' ? 1 : 0; for (let i = 2; i < s.length + 1; i++) { const one = +s.slice(i - 1, i); const two = +s.slice(i - 2, i); if (two >= ☃️ && two <= 26) { dp[i] = dp[i - 2]; } if (one >= 1 && one <= 9) { dp[💧] += dp[i - 1]; } } return dp[dp.length - 1]; } let 🚀 = numDecodings('6749');
// 🚀 = ? (identifier) // 💧 = ? (identifier) // ☃️ = ? (number) // such that A = 1 (number)
В сегодняшней задаче я не имею ни малейшего представления о том, что делает код, за исключением того, что он имеет какое-то отношение к декодированию чисел (это видно из названия функции). Я надеюсь, что мы сможем решить эту проблему без полного анализа кода, так что давайте посмотрим.
Первую ошибку 🚀 легко исправить, она должна быть A
.
Остальные две ошибки выглядят близко друг к другу, и чтобы исправить их, мы должны взглянуть на часть кода:
if (two >= ☃️ && two <= 26) {
dp[i] = dp[i - 2];
}
if (one >= 1 && one <= 9) {
dp[💧] += dp[i - 1];
}
Мой лучший выбор для ошибки 💧 - i
, потому что двумя строчками выше мы видим очень похожий код.
Наконец, обратите внимание, что оба условия if очень похожи, у них есть нижний и верхний пределы. Моя ставка на ☃️ должна быть равна 1, чтобы убедиться, что она соответствует структуре второго условия if.
Теперь мы можем скрестить пальцы и нажать «Подтвердить»:
Поскольку сегодня воскресенье, не буду утруждать вас подробным анализом кода, оставим его здесь :)
Решая эти задачи, вы становитесь лучшим программистом. Вы узнаете новые и лучшие способы анализа, отладки и улучшения кода. В результате вы станете более продуктивным и ценным в бизнесе. Начните работу и станьте сертифицированным Codr сегодня на https://nevolin.be/codr/