Привет и добро пожаловать @jaronow!
Сначала continue
пропускает вас к следующей итерации while
.Итак, что вы написали здесь ...
if (total === bad) {
continue;
}
total += 1
... на самом деле означает, "Если это неверное количество шагов, пропустите добавление 1." Но вы имеете в видунаоборот, не так ли?
if (total === bad) {
total += 1
}
Теперь это говорит: «Если это неверное количество шагов, добавьте еще 1». Там, так что теперь у нас есть
function maxStep(n, k) {
let step = n
let bad = k
let total = 0
while (total <= step) {
total += 1
if (total === bad) {
total += 1 // Put this here instead of continue.
}
return total
}
}
Теперь, где вы положили, это странно:
return total
Это фактически завершает всю функцию при первом обнаружении.Конечно, вы хотите рассчитать total
, выполнив цикл столько раз, сколько необходимо, а затем вернуть результат в end , например:
function maxStep(n, k) {
let step = n
let bad = k
let total = 0
while (total <= step) {
total += 1
if (total === bad) {
total += 1
}
}
return total // Moved this out.
}
Наконец, есть два тонкихпроблемы (заметил второй позже).Во-первых, если вы делаете этот «дополнительный шаг» из-за того, что вы столкнулись с плохим шагом, вам также нужно увеличить step
, так как это максимальное количество шагов, которые вы планируете сделать.Но также, как только вы достигнете этого количества шагов, вы не захотите снова входить в цикл и добавлять еще к total
, поэтому вам нужно использовать <
вместо <=
.(Вы найдете в программировании общую схему, когда, когда вы намереваетесь делать N раз, вы пишете свои циклы, говоря < N
, а не <= N
.)
function maxStep(n, k) {
let step = n
let bad = k
let total = 0
while (total < step) {
total += 1
if (total === bad) {
total += 1
step += 1 // Add this.
}
}
return total
}
В противном случае ваш total
всегда будет заканчиваться исходным числом step
с.
Существуют другие более короткие, возможно, более умные способы решения этой проблемы, но я стремлюсь учить, придерживаясь вашей формулировки.
Не то, о чем вам нужно заботиться, но в случае, если вы захотите увидеть, опытный программист может «рефакторинг» вашего кода следующим образом:
function getStepsTaken(desiredStepsToTake, badNumberOfSteps) {
let stepsToTake = desiredStepsToTake
// let bad = k (don't need this line)
let stepsTaken = 0
while (stepsTaken < stepsToTake) {
stepsTaken += 1
if (stepsTaken === badNumberOfSteps) {
stepsTaken += 1
stepsToTake += 1
}
}
return stepsTaken
}
Вы можете посчитать это уродливым,и действительно, это намного более многословно, но всегда лучше прояснить ситуацию, даже если только для вас самих, и вы позже переименуете переменные.
Хотя надежная попытка, продолжайте в том же духе.