【LeetCode】728. Self Dividing Numbers

sexyoung
進擊的 Front End‘s
2 min readNov 30, 2018

最近想要重新練練演算法,想到之前同事有跟我提過 LeetCode 上有很多題目可以練習,加強對程式邏輯上的訓練。最近想重新回歸練習一下,決定從最簡單的題目開始練習。

Self Dividing Numbers 題目是:給最小值(Left) 與最大值(Right),然後找出這兩數之間所有的自除數。

自除數定義:可以被自己的每一位數整除的數,即是自除數。比方說:128可以被 1、2、8整除,128即是整除數。但有個前提是,如果數字本身有0就一定不是自除數。比方說 10、101、2040都不是自除數。

我的解法

給參考,但不一定是最佳解:

  1. 先寫一個迴圈從 left 到 right,迴圈在開始與重複時,d 設為 i
  2. 迴圈裡遇到10的倍數則 for continue
  3. 進到 do 迴圈
  4. 如果 i 不能被 d 的個位數整除,即非自除數,continue for loop i
  5. 如果 i 可以被 d 的個位數整除,則將 d 整除整除 10
  6. 如果 d 非 0 則跳至步驟4
  7. 離開 while 迴圈,把 i push 到 numbers 陣列裡
  8. 回傳 numbers 陣列。
/**
* @param {number} left
* @param {number} right
* @return {number[]}
*/
var selfDividingNumbers = function(left, right) {
let d = 0;
let numbers = [];
labelI:
for (let i = left, d = i; i <= right; i++, d = i) {
if (!(i % 10)) continue;
do {
if (i % (d % 10) !== 0) continue labelI;
d = ~~(d / 10);
} while (d);
numbers.push(i);
}
return numbers;
};

執行結果

left = 1, right = 22, Runtime: 48 ms

如果你覺得不錯,請幫我按拍手,覺得屌,按3秒,覺得超屌,按5秒

--

--