【问题标题】:push numbers that repeats only 2 times in sequence in a new array在新数组中按顺序仅重复 2 次的数字
【发布时间】:2016-05-14 23:55:10
【问题描述】:

我希望我的数组 puma 在代码末尾包含 2,3,5,7,13,17,19,23。 (就是在数字数组中依次重复02次)谢谢

<!DOCTYPE html>
<html>
  <head>
    <title>Trial</title>
  </head>
  <body>
    <script>
      var number = [1,2,2,3,3,4,4,4,5,5,6,6,6,6,7,7,8,8,8,8,
                    9,9,9,10,10,10,10,10,11,12,12,12,12,12,12,
                    12,13,13,14,14,14,14,14,15,15,15,15,15,
                    16,16,16,16,16,17,17,18,18,18,18,18,18,
                    18,18,19,19,20,20,20,20,20,20,20,21,
                    21,21,21,22,22,22,22,23,23];
      var puma=[];
      for (k=0; k<number.length; k++)
        for (i=1; i<number.length; i++) 
          for (j=2; j<number.length; j++) 
          {
            if (number[k]==number[i] && number[k]!==number[j])
            {
              puma.push(number[k]);
            }
          };

      document.write(puma);
    </script>
  </body>
</html>

【问题讨论】:

  • 您的意思是奇数还是唯一值? ?
  • @Neta 我想要这些作为结果 2,3,7,13,17,19,23
  • 如果我们有这个数组怎么办:[2, 2, 0, 0, 2, 2, 2]?结果应该是[0] 还是[0, 2]
  • 这是个好问题,但是我的数据是按顺序分布的,所以如果我已经有 2,2,就没有机会找到 2,2,2。

标签: javascript arrays math methods


【解决方案1】:

我们可以为此目的使用counting sorting 概念。所以我们可以先统计每个元素的个数。然后获取计数等于 2 的元素。

var number = [1,2,2,3,3,4,4,4,5,5,6,6,6,6,7,7,8,8,8,8,9,9,9,10,10,10,10,10,11,12,12,12,12,12,12,12,13,13,14,14,14,14,14,15,15,15,15,15,16,16,16,16,16,17,17,18,18,18,18,18,18,18,18,19,19,20,20,20,20,20,20,20,21,21,21,21,22,22,22,22,23,23],
    counts = [],
    puma=[],
    i;

for(i = 0; i < number.length; i++) {
    counts[number[i]] = !!counts[number[i]] ? counts[number[i]] + 1 : 1;
}

function getNumbers(counts, n) {
    return counts.reduce(function(a, c, i) {
        if(c === n) {
            a.push(i);
        }
        return a;
    }, []);
}


document.write(getNumbers(counts, 2) + '</br>');
document.write(getNumbers(counts, 3) + '</br>');
document.write(getNumbers(counts, 4));

更新

如果只需要通过序列来获取数字,那么我们有两种可能的情况:

  1. 当只有一个序列并且它的长度=N时
  2. 当有多个序列且其中一个的长度等于 N 时。

var number = [0, 0, 1, 1, 2, 1, 1, 1],
    counts = [],
    puma=[],
    prev, i, currentCount = 1;

for(i = 1, prev = number[0]; i < number.length; i++) {
	var current = number[i];
	
	if(prev === current) {
		currentCount++;
	}
	
	if(prev !== current || i === number.length - 1) {
		console.log(prev)
		counts[prev] = (counts[prev] || []).concat([currentCount]);
		prev = current;
		currentCount = 1;
	}
}

// (2nd situation) Get every number if it was found N times in a sequence
function getNumbers1(counts, n) {
    return counts.reduce(function(a, c, i) {
        if(c.indexOf(n) > -1) {
            a.push(i);
        }
        return a;
    }, []);
}

// (1st situation) Get number only if there is only one sequence of this number and it's length is equal to N
function getNumbers2(counts, n) {
    return counts.reduce(function(a, c, i) {
        if(c.length === 1 && c[0] === n) {
            a.push(i);
        }
        return a;
    }, []);
}

document.write(getNumbers1(counts, 2) + '</br>');
document.write(getNumbers2(counts, 2));

在这段代码中,我们首先获取每个数字的每个序列的所有长度。然后得到我们需要的序列。 在上一个示例中,counts 数组在

之后将等于 [ [ 2 ], [ 2, 3 ], [ 1 ] ]

【讨论】:

  • 不检查排序...只检查总数。可能无法正常工作,具体取决于 OP 输入是否可以排序或在更特定的术语中......必须对 OP 输入进行排序
  • 这将完美运行,正是 OP 想要的
  • @NetaMeta 在数组末尾放置了一个额外的数字,由于总计数与序列计数,它没有相同的输出。 OP 确实要求提供序列计数。我并不是说这行不通,但也取决于未明确定义的 OP 约束
  • jsfiddle.net/152r15ny/1 在相同的序列中工作得非常好——正如预期的那样——也许举个例子来证明你的观点?
  • @yuriy 我希望能够在我的数组中导航。我的意思是,如果我想对只出现 03 次的数字做同样的事情怎么办?结果 (4,9) 及更高版本的数字仅出现 4 次?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2011-06-13
  • 2012-07-06
  • 2011-10-06
  • 1970-01-01
  • 2014-05-14
相关资源
最近更新 更多