Fast/Slow Pointers: Happy Number

by Raul Bojalil

HTML

<div class="markdownViewer select-text  markdown-default markdown-table markdown-viewer markdown-viewer-heading" role="none"><h2 class="hover-anchor" id="Statement" data-id="e912159ba4656d694eefa773cabf35b3">Statement<a href="#Statement"><span class="anchor-link">#</span></a></h2>
<p data-id="d1444ace5a30917fbbbc0627cc9a1f50">Write an algorithm to determine if a number <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> is a happy number.</p>
<p data-id="bb0cae2acd8cc656d66b92fd6ac77564">We use the following process to check if a given number is a happy number:</p>
<ul data-id="09c01eb25ce936e7a8919b5b2759e29e">
<li>Starting with the given number <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>, replace the number with the sum of the squares of its digits.</li>
<li>Repeat the process until:
<ul>
<li>The number equals <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>, which will depict that the given number <span class="katex"><span class="katex-mathml"><math...

JavaScript

function isHappyNumber(n) {

  // Helper function that calculates the sum of squared digits.
  function sumOfSquaredDigits(number) {
    let totalSum = 0;
    while (number > 0) {
      let temp = Math.floor(number / 10),
          digit = number % 10;
      number = temp;
      totalSum += digit ** 2;
    }
    return totalSum;
  }

  let slowPointer = n; 
  let fastPointer = sumOfSquaredDigits(n);

  while (fastPointer !== 1 && slowPointer !== fastPointer) {
    slowPointer = sumOfSquaredDigits(slowPointer);
    fastPointer = sumOfSquaredDigits(sumOfSquaredDigits(fastPointer));
  }

  if(fastPointer == 1){
    return true
  }
  return false
}

// Driver code
function main() {
  inputs = [1, 5, 19, 25, 7];
  for (var i = 0; i < inputs.length; i++) {
    console.log(i + 1 + ".\tInput Number:", inputs[i])

    var result = (isHappyNumber(inputs[i])) ? "True" : "False"

    console.log("\n\tIs it a happy number?", result)
    console.log("-".repeat(100));
  }
}

main();