給定這個陣列,我想檢查“sequence”是否是“array”的子序列,這意味著所有數字都存在于原始陣列中并且以相同的順序存在:
array = [5, 1, 22, 25, 6, -1, 8, 10];
sequence = [1, 6, -1, 10];
不知道為什么我的代碼不起作用。
function isValidSubsequence(array, sequence) {
let seqIdx = 0;
let arrId = 0;
for (const value of sequence ){
if (seqIdx === sequence.length) break;
if (array[arrId] === value) {
seqIdx ;
arrId ;
}
}
return seqIdx === sequence.length
}
uj5u.com熱心網友回復:
您的解決方案不起作用,因為它永遠不會超過array. sequence除非值匹配,否則您永遠不會增加任何索引array[arrId]。
我會結合使用Array.prototype.indexOf()和Array.prototype.slice()在搜索時創建一個縮小的視窗array。如果你遇到了一個sequence無法找到的迭代,你就知道它沒有通過測驗
function isValidSubsequence(array, sequence) {
let slice = array.slice(); // start with a shallow copy
for (const value of sequence) {
let index = slice.indexOf(value); // find the next sequence value
if (index === -1) {
return false; // not found, return false immediately
}
slice = slice.slice(index); // shrink the window
}
return true;
}
const array = [5, 1, 22, 25, 6, -1, 8, 10];
const sequence = [1, 6, -1, 10];
console.log("valid sub-sequence:", isValidSubsequence(array, sequence))
console.log("out of order:", isValidSubsequence(array, [25, 22]))
console.log("unknown elements:", isValidSubsequence(array, [5, 11]))
uj5u.com熱心網友回復:
洗掉arrIdx.
在回圈中,在這種情況下不需要for...of索引,因為每次迭代都會進行。arrayvalue
洗掉第一個流控制陳述句。
if (seqIdx === sequence.length) break;
無需中斷回圈。在回圈外回傳的布林值就足夠了。
將第二條流控制陳述句改為monitor sequence[seqIdx]notarray
if (sequence[seqIdx] === value) {
seqIdx ;
}
該演算法的關鍵是array一次通過一個數字(這是標準),而不是sequence. 計數器 ,seqIdx僅在匹配時進行,所以基本上如果sequence在回圈之前或結束時結束,它是一個有效的子序列。
const arr = [5, 1, 22, 25, 6, -1, 8, 10];
const seq = [1, 6, -1, 10];
function isValidSubsequence(array, sequence) {
let seqIdx = 0;
for (const value of array) {
if (sequence[seqIdx] === value) {
seqIdx ;
}
}
return seqIdx === sequence.length;
};
console.log(isValidSubsequence(arr, seq));
uj5u.com熱心網友回復:
您可以通過從原始陣列中找到序列陣列元素的索引,然后檢查索引陣列是否已排序,以一種簡單的方式實作它。
演示:
const array = [5, 1, 22, 25, 6, -1, 8, 10];
const sequence = [1, 6, -1, 10];
// Find index of the elements from the original array.
const indexArr = sequence.map((item) => array.indexOf(item));
// Now test if this indexed array is sorted or not to check if sequence array having same order as per the original array.
function isSorted(arr) {
var i = 0;
var last = arr.length - 1;
return (function check() {
return (i >= last) || (arr[i] <= arr[ i] && check());
})();
}
console.log(isSorted(indexArr))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/449374.html
標籤:javascript 数组 子序列
上一篇:找不到檔案:'Chart.js'與磁盤上的相應名稱不匹配:'.\node_modules\chart.js\dist\chart.js'
