我想創建一個函式,如果一個數字是否有連續數字,則回傳 true,
例子:
- 如果輸入為 11,則回傳 true
- 如果輸入為 21,它將回傳 false
- 如果輸入是 323,它將回傳 false,因為即使我們有 3 個重復,它們也不是連續的
我現在的解決方案是將數字轉換為陣列并逐個回圈遍歷數字,如果下一個數字等于當前數字,則我們只回傳true。但這具有 O(n) 的復雜時間,我想知道是否有人可以提出更好的解決方案。
謝謝
uj5u.com熱心網友回復:
有一個可以說是更好的解決方案,您不需要將數字轉換為字串或數字/字符陣列。它的作業原理如下:
- 將變數初始化
curr為-1。 - 運行一個回圈
while num > 0并執行以下操作:
next_curr = num % 10if next_curr == curr: return truecurr = next_currnum = num / 10(整數除法)
- 如果回圈完成,則回傳 false。
這是一種一次性O(log n)時間復雜度演算法,其中n是輸入數字。空間復雜度為O(1)
請注意,雖然您的演算法也是O(log n)時間復雜度,但它執行了 2 次,并且空間復雜度O(log n)也為。
我已經有一段時間沒有寫 JS 了,但是這里有一個可能在 JS 中實作上述演算法的方法:
function sameAdjacentDigits(num) {
// to deal with negative numbers and
// avoid potential problems when using Math.floor later
num = Math.abs(num)
let curr = -1
while (num > 0) {
const nextCurr = num % 10
if (nextCurr == curr) return true
curr = nextCurr
num = Math.floor(num / 10)
}
return false
}
uj5u.com熱心網友回復:
執行此操作的最簡單方法是使用正則運算式。不確定演算法的有效性,但解決方案可能是
/(\d)\1/
uj5u.com熱心網友回復:
使用一些正則運算式,然后檢查通過匹配器找到的內容
numbers_match = /(00|11|22|33|44|55|66|77|88|99)/;
numbers_match.match("11")
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
uj5u.com熱心網友回復:
靈感來自@Tschallacka 的回答:
let numbers = [11,21,323];
let result = numbers.map(n=>{
let test = n.toString().match(/(00|11|22|33|44|55|66|77|88|99)/);
return test != null;
})
console.log(result);
uj5u.com熱心網友回復:
我建議以下解決方案。不幸的是不確定時間復雜度,但我想一次取 2 個數字應該會減少執行時間。
function hasConsecutive(input) {
const str = String(input);
let last;
for (let i = 0; i < str.length; i = 2) {
if (str[i] === last) return true;
if (str[i] === str[i 1]) return true;
last = str[i 1];
}
return false;
}
console.log(hasConsecutive(123455678));
uj5u.com熱心網友回復:
function has_consecutive_digits(num) {
for (let index = 0; num>0; index ) {
var lastdigit = num%10
var newnum = intval(num/10)
var beforelastdigit = newnum%10
if(beforelastdigit == lastdigit){
return true;
}
num = intval(num/10)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/411528.html
標籤:
