2023-09-24|閱讀時間 ‧ 約 3 分鐘

#8 Codewars - Find the next perfect square! (7 kyu)

題目

原始題目

您可能知道一些相當大的完全平方數。但是下一個呢?

完成 findNextSquare 方法,該方法用於找出參數後的下一個整數完全平方數。回想一下,整數的完全平方數是一個整數n,因此sqrt ( n )也是一個整數。

如果參數本身不是完全平方數,則返回 -1 。您可以假定該參數為非負數。

範例:(輸入->輸出)
121 --> 144
625 --> 676
114 --> -1 since 114 is not a perfect square

拆解流程

依據題意可整理出以下重點:

  • 目標:找出下一個會成為完美平方的整數
  • 規則
  1. 參數傳入的是乘積
  2. 當參數不是完美正方形,需返回 -1
  3. 假設傳入的參數是非負數
  • 方法
  1. 使用 sqrt( ) 方法計算傳入參數的平方根
  2. 將得出的值 +1 並平方,就能得到下一個完全平方數


程式撰寫

  • 使用 Number.isInteger( ) 判斷傳入值是否為整數,就能確認該值是否能成為完整平方數
function findNextSquare(sq) {
let sqNum = Math.sqrt(sq);
if (!Number.isInteger(sqNum)) {
return -1;
}
return (sqNum + 1) ** 2;
}

改善寫法

  • 寫法一:Math.pow(base, exponent)計算基數的指數總和
console.log(Math.pow(7, 2)); //49

因此可改寫如下:

function findNextSquare(sq) {
let sqNum = Math.sqrt(sq);
if (!Number.isInteger(sqNum)) {
return -1;
}
return Math.pow(sqNum + 1, 2);
}
  • 寫法二
  1. 運用餘數判斷平方根後的數值是否為整數
  2. 使用三元運算子決定回傳值
  3. 有運用到 falsy 值概念,0 會轉型成布林型別的 false
function findNextSquare(sq) {
let sqNum = Math.sqrt(sq);
//若傳入的參數可被 1 整除,餘數為 0,那就代表該數是整數
//0 會被轉型成布林型別的 false
//於是會回傳 Math.pow(sqNum + 1, 2)

//如果不能整除,餘數就不為 0
//不為零的數字會被轉型成布林型別的 true
//於是回傳 -1
return sqNum % 1 ? -1 : Math.pow(sqNum + 1, 2);
}

這個寫法相當精簡,原來還可以這樣寫!

今天就介紹到這裡,如果大家有更好的寫法歡迎一起來討論~

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.