首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jQuery或javascript检查数字子集是否位于系列的起始部分或序列的底部。

使用jQuery或javascript检查数字子集是否位于系列的起始部分或序列的底部。
EN

Stack Overflow用户
提问于 2017-06-22 12:26:16
回答 3查看 74关注 0票数 3

例如:我设置了1,3,4,5,6,7,8,10,11

  1. 场景1:子集= 1,3,4,该系列的起始部分=可接受的
  2. 场景2:子集= 8,10,11,该系列的结尾部分=可接受的
  3. 场景3:子集= 1,3,10,11,该系列的起始部分和结尾部分均为=可接受的
  4. 场景4:子集= 1,3,6,8,这是在系列的开始部分,也是在系列的中间=不被接受的

要实现的主要目标是检查给定系列是否处于系列的起始部分或结束部分,而不使用jquery或javacript中断该系列。

我们将非常感谢你的帮助。

提前感谢

EN

回答 3

Stack Overflow用户

发布于 2017-06-22 17:40:11

您可以使用两次传递方法,首先为所有子数组项从开始和结束收集相同索引下的比较(稍后表示为左侧和右侧)。

为了指示结果,返回4个状态,这意味着

  • 0 -没有匹配,从左边和右边都不匹配值,
  • 1 -数组左侧的项匹配,
  • 2 -数组右侧的项匹配,
  • 3 -双方的项目匹配。

在收集表示匹配和位置的值之后,必须将值合并到想要的结果truefalse

要检查每个值,您需要另一个值,该值表示预期的一面。在开始时,预期的侧设置为1,因为它从左侧开始检查。

Array#every回调的临时结果是对实际值是否大于或等于预期值进行一次检查。这包括指示符3,因为这个值位于两边。零的值也退出循环。

如果找到了2的值,则表示右侧,并且以下所有元素都必须大于2,因此预期值设置为2

给出的解决方案可以缩短为只返回所需的布尔值。

代码语言:javascript
复制
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
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

没有临时数组的短版本。

代码语言:javascript
复制
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
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN

Stack Overflow用户

发布于 2017-06-22 17:58:24

一种简单的方法:从两个数组的开头和结尾删除匹配的数字,并查看是否有剩余的数据。

代码语言:javascript
复制
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.

票数 1
EN

Stack Overflow用户

发布于 2017-06-22 18:23:24

您将从左到右,从右到左迭代子数组,并在“对应位置”的主数组中的值与值不匹配的地方停止,即从数组的同一侧计数位置。

如果在两个循环的末尾,子数组的所有值都匹配,即两个索引互相交叉,则结果是true

以下是代码:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44699384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档