例如:我设置了1,3,4,5,6,7,8,10,11
方案1:subset = 1,3,4,它位于系列的开始部分= 可接受
方案2:subset = 8,10,11,它位于系列的结尾部分= 可接受
方案3:subset = 1,3,10,11,它位于系列的开始和结束部分= 可接受
方案4:subset = 1,3,6,8,它位于系列的开始部分,也位于系列的中间= 不可接受。
要实现的主要目的是检查给定系列是否在系列或结束部分的开始部分而不破坏使用jquery或javacript的系列
非常感谢帮助
提前致谢
答案 0 :(得分:1)
您可以使用两遍方法,首先收集所有子阵列项目,从开始和结束(后面表示为左侧和右侧)的相同索引进行比较。
为了表示结果,返回4个状态,表示
0
- 不匹配,左侧和右侧都不匹配值1
- 数组左侧的项匹配,2
- 数组右侧的项匹配,3
- 项目双方都匹配。收集代表匹配和排名的值后,必须将值合并到所需结果true
或false
。
要检查每个值,您需要另一个代表预期值的值。在开始时,预期的一侧设置为1
,因为它从左侧开始检查。
如果实际值大于或等于预期值,则Array#every
回调的临时结果是单次检查。这包括指标3
,因为此值在两侧。零值也会退出循环。
如果找到值2
,则表示右侧,并且所有后续元素必须大于2
,因此预期值设置为2
。< / p>
可以缩短所提出的解决方案,只返回想要的布尔值。
function check(array, subarray) {
var expected = 1,
temp = subarray.map(function (a, i) {
var offset = array.length - subarray.length;
return (a === array[i]) + 2 * (a === array[i + offset]);
}),
result = temp.every(function (a) {
var r = a >= expected;
if (a === 2) {
expected = 2;
}
return r;
});
return temp.concat(result);
}
var array = [1, 3, 4, 5, 6, 7, 8, 10, 11];
console.log(check(array, [1, 3, 4])); // true
console.log(check(array, [8, 10, 11])); // true
console.log(check(array, [1, 3, 10, 11])); // true
console.log(check(array, [1, 3, 6, 8])); // false
console.log(check([1, 2, 3, 4, 5, 6], [1, 4, 3, 6])); // false
console.log(check([1, 2, 3, 4, 5, 6], [1, 4, 3, 6])); // false
console.log(check([1, 2, 3, 2, 3, 4], [3, 2, 3, 2])); // false
console.log(check([1, 2, 3, 2, 3, 4], [1, 2, 3, 4])); // true
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
没有临时数组的简短版本。
function check(array, subarray) {
var offset = array.length - subarray.length,
expected = 1;
return subarray.every(function (a, i) {
var state = (a === array[i]) + 2 * (a === array[i + offset]),
result = state >= expected;
if (state === 2) {
expected = 2;
}
return result;
});
}
var array = [1, 3, 4, 5, 6, 7, 8, 10, 11];
console.log(check(array, [1, 3, 4])); // true
console.log(check(array, [8, 10, 11])); // true
console.log(check(array, [1, 3, 10, 11])); // true
console.log(check(array, [1, 3, 6, 8])); // false
console.log(check([1, 2, 3, 4, 5, 6], [1, 4, 3, 6])); // false
console.log(check([1, 2, 3, 4, 5, 6], [1, 4, 3, 6])); // false
console.log(check([1, 2, 3, 2, 3, 4], [3, 2, 3, 2])); // false
console.log(check([1, 2, 3, 2, 3, 4], [1, 2, 3, 4])); // true
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 1 :(得分:1)
一种简单的方法:从两个数组的开头和结尾删除匹配的数字,看看是否有剩余的数据。
var checkIt = function(arr,subarr) {
// strip off matching numbers at the beginning
while (subarr.length && arr[0] === subarr[0]) {
arr.shift();
subarr.shift();
}
// strip off matching numbers at the end
while (subarr.length && arr[arr.length - 1] === subarr[subarr.length - 1]) {
arr.pop();
subarr.pop();
}
// if there aren't any leftovers, return true
return (subarr.length === 0)
}
console.log(checkIt( [1, 3, 4, 5, 6, 7, 8, 10, 11],[1, 3, 4]));
console.log(checkIt( [1, 3, 4, 5, 6, 7, 8, 10, 11],[8, 10, 11]));
console.log(checkIt( [1, 3, 4, 5, 6, 7, 8, 10, 11],[1, 3, 10, 11]));
console.log(checkIt( [1, 3, 4, 5, 6, 7, 8, 10, 11],[1, 3, 6, 8]));
// pathological edge case:
console.log(checkIt( [1,2,3,2,1],[1,2,3,2,1] ))
// This returns true, but based on the rules of the puzzle I'm honestly not sure whether that's correct.
&#13;
答案 2 :(得分:1)
您将从左到右,从右到左遍历子阵列,并在值与#34;对应位置&#34;的主阵列中的值不匹配时停止,即位置从阵列的同一侧计数。
如果在两个循环结束时子数组的所有值都匹配,即两个索引相互交叉,则结果为true
。
以下是代码:
function isSubsetAtEnds(array, subarray) {
const diff = array.length - subarray.length;
let i, j;
if (diff < 0) return false;
for (i = 0; i < subarray.length; i++)
if (array[i] !== subarray[i]) break;
for (j = subarray.length - 1; j >= i; j--)
if (array[j+diff] !== subarray[j]) break;
return j < i;
}
var array = [1, 3, 4, 5, 6, 7, 8, 10, 11];
console.log(isSubsetAtEnds(array, [1, 3, 4])); // true
console.log(isSubsetAtEnds(array, [8, 10, 11])); // true
console.log(isSubsetAtEnds(array, [1, 3, 10, 11])); // true
console.log(isSubsetAtEnds(array, [1, 3, 6, 8])); // false
&#13;