Back to all solutions
#1387 - Sort Integers by The Power Value
Problem Description
The power of an integer x is defined as the number of steps needed to transform x into 1 using the following steps:
- if x is even then x = x / 2
- if x is odd then x = 3 * x + 1
For example, the power of x = 3 is 7 because 3 needs 7 steps to become 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1).
Given three integers lo, hi and k. The task is to sort all integers in the interval [lo, hi] by the power value in ascending order, if two or more integers have the same power value sort them by ascending order.
Return the kth integer in the range [lo, hi] sorted by the power value.
Notice that for any integer x (lo <= x <= hi) it is guaranteed that x will transform into 1 using these steps and that the power of x is will fit in a 32-bit signed integer.
Solution
/**
* @param {number} lo
* @param {number} hi
* @param {number} k
* @return {number}
*/
var getKth = function(lo, hi, k) {
const powerValues = new Map();
const numbers = Array.from({ length: hi - lo + 1 }, (_, i) => lo + i);
numbers.sort((a, b) => {
const powerA = getPower(a);
const powerB = getPower(b);
return powerA === powerB ? a - b : powerA - powerB;
});
return numbers[k - 1];
function calculatePower(num) {
let steps = 0;
while (num !== 1) {
if (num % 2 === 0) {
num = num / 2;
} else {
num = 3 * num + 1;
}
steps++;
}
return steps;
}
function getPower(num) {
if (!powerValues.has(num)) {
powerValues.set(num, calculatePower(num));
}
return powerValues.get(num);
}
};