From 7708c0f5855ac4d71a78ddab804a514845bc6d72 Mon Sep 17 00:00:00 2001 From: Greg Hurrell Date: Fri, 2 Jun 2017 08:32:00 -0700 Subject: [PATCH] Reuse stack more aggressively We see that we can always find a re-usable item somewhere in the stack; we don't have to give up after looking at the last item alone. --- src/multiplyDigits.js | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/multiplyDigits.js b/src/multiplyDigits.js index 4350b36..fd66202 100644 --- a/src/multiplyDigits.js +++ b/src/multiplyDigits.js @@ -37,21 +37,24 @@ export default function multiplyDigits( count *= 2; memo.push({count, result}); memoIndex++; - } else { - const last = memoIndex >= 0 ? memo[memoIndex--] : null; - if (last && last.count <= multiplier) { - // We can use a previous result on the stack to leap ahead. - result = addDigits(result, last.result, base); - multiplier -= last.count; - count += last.count; - } else if (memoIndex < 0) { - // Stack is empty, so fall back to base case (single addition). - result = addDigits(result, multiplicand, base); - multiplier--; - count++; - memo.push({count, result}); - memoIndex++; + } else if (memoIndex >= 0) { + // We can use a previous result from the stack to leap ahead. + while (memoIndex >= 0) { + const previous = memo[memoIndex--]; + if (previous.count <= multiplier) { + result = addDigits(result, previous.result, base); + multiplier -= previous.count; + count += previous.count; + break; + } } + } else { + // Stack is empty, so fall back to base case (single addition). + result = addDigits(result, multiplicand, base); + multiplier--; + count++; + memo.push({count, result}); + memoIndex++; } } -- 2.37.1