javascript - 将按顺序仅重复 2 次的数字推送到新数组中

标签 javascript arrays math methods

我希望我的数组 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>

最佳答案

我们可以使用计数排序概念来达到此目的。所以我们可以先统计每个元素的个数。然后获取计数等于二的元素。

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 ] ]

关于javascript - 将按顺序仅重复 2 次的数字推送到新数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37233073/

相关文章:

javascript - AngularJS 工具提示工具提示打开不工作

javascript - Python 优于 JavaScript? (请提供事实)

C# 使用 Microsoft.Office.Interop.Excel 读取数据

arrays - 每 2 列切片矩阵

math - 将任意长度转换为 -1.0 到 1.0 之间的值?

javascript - Three.js OrbitControls.js 缩放比例非线性

javascript - 在揭示模块模式中返回 jQuery Promise

swift - 将结构(包括字节数组)与 SWIFT 结合使用 - 结构到 NSData 和 NSData 到结构

java - 接受用户输入的方法

algorithm - 如何翻转两个相连三角形的边?