Следующий код находит, если данное число является идеальным квадратом в O (lg N). Как я могу избежать жесткого кодирования углового футляра if (num === 1) { return true; }
в приведенном ниже решении? Есть идеи?Как избежать углового случая при решении идеального квадрата в O (lg N) времени?
var isPerfectSquare = function(num) {
let floor = 0, ceiling = num, mid;
// Corner case
if (num === 1) {
return true;
}
while (floor != ceiling) {
mid = floor + (ceiling - floor)/2 | 0;
let mul = mid * mid;
if (mul === num) {
return true;
}
if (mul > num) {
ceiling = mid;
}
else if (mul < num) {
floor = mid+1;
}
}
return false;
};
Возможный дубликат [Самый быстрый способ определить, является ли квадратный корень целого целым числом] (http://stackoverflow.com/questions/295579/fastest-way-to-determine-if-an-integers-square-root -is-an-integer) – P0W
@ P0W, по крайней мере, читать первые строки вопроса перед маркировкой как дубликаты. Мне не нужно искать более быстрое решение. Мой вопрос заключается в том, чтобы избегать углового случая. – baltoro
@ P0W, предлагаемый dupe помечен тегом [tag: java], хотя принятый ответ находится в C++ – Kaiido