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();