我有这个程序,目前发现重复的,并打印出来,使用多姆在各部分。我正在编辑它,以便它还显示输入数组中根本没有发生过的数字,以及在输入数组中只发生过一次的数字。不包括0作为一个没有发生的数字。另外,将变量设置为最大数字范围,我们将检查输入数组中是否出现一个数字。输出的分段工作得很好,我基本上只是在输出中添加0和1次的数字。我看不出该怎么做才对。请协助。谢谢。
示例数组输入4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,5 当前示例输出:(区段变量= 3): 4-9次 2-8次 3-7次 1-6次 7-5次 6-4次 期望输出:示例1(区段变量=3.number variable = 9): 4-9次 2-8次 3-7次 1-6次 7-5次 6-4次 5-1次 8-0次 9-0次 期望输出:示例2(区段变量=3.number variable = 21): 4-9次 2-8次 3-7次 1-6次 7-5次 6-4次 5-1次 8-0次 9-0次 10-0次 11-0次 12-0次 13 -0次 14 -0次 15-0次 16 -0次 17 -0次 18 -0次 19 -0次 20 -0次 21 -0次
//Count how many times each number shows up
//const duplicateArr2 = [1, 1, 1, 1, 1, 100, 3, 5, 2, 5, 2, 23, 23, 23, 23, 23];
//const duplicateArr1 = [5, 3, 7, 4, 7, 5, 3, 2, 7, 3, 2];
//const duplicateArr2 = [4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,55,55,67,67,45,54,45,54];
//const duplicateArr2 = [4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,55,55,67,67,45,54,45,54,100,100,200,200,300,300];
//const duplicateArr2 = searchednumbers;
const duplicateArr2 = [4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 3, 7, 3, 3, 3, 1, 6, 6, 1, 1, 1, 1, 1, 7, 7, 7, 7, 6, 6, 5]
const getArrayOfDuplicated = array => {
const hash = array.reduce((a, c) => (a[c] = ++a[c] || 1, a), {});
return Object.entries(hash)
.filter(([k, v]) => v > 1)
.sort(([ak, av], [bk, bv]) => bv - av)
.reduce((a, [k, v]) => [...a, `${k} - ${v} times`], [])
};
// given a number of items to be sectioned into a certain number of groups
// returns a list of length nGroups with the number of items in each group
// such that at least (nGroups - 1) groups contain an equal number of items
// eg. getGrouping(10, 2) -> [5, 5]
// eg. getGrouping(10, 6) -> [1, 1, 1, 1, 1, 5]
const getGrouping = (nItems, nGroups) => {
if (nGroups > nItems)
return Array(nItems).fill(1);
else if (!(nItems % nGroups))
return Array(nGroups).fill(parseInt(nItems / nGroups));
else {
let numberOfEqualGroups = nGroups - 1;
var itemsPerEqualGroup;
if (!(nItems % (nGroups - 1)))
itemsPerEqualGroup = parseInt(nItems / (nGroups - 1)) - 1;
else
itemsPerEqualGroup = parseInt(nItems / (nGroups - 1));
equalGroups = Array(numberOfEqualGroups).fill(parseInt(itemsPerEqualGroup));
remainder = nItems - itemsPerEqualGroup * numberOfEqualGroups;
return equalGroups.concat(remainder);
}
}
// takes an array and formats it into sections according to grouping
// returns a string with a newline after each line and two new lines between sections
const formatGrouping = (array, grouping) => {
var outputString = ""
var linesDone = 0;
for (var section = 0; section < grouping.length; section++) {
for (var line = 0; line < grouping[section]; line++) {
outputString += array[linesDone] + '<br>';
linesDone += 1;
}
outputString += '<br>';
}
return outputString;
};
var numberOfSections = 3;
result = getArrayOfDuplicated(duplicateArr2);
document.getElementById("jsresultsoutput").innerHTML = formatGrouping(result, getGrouping(result.length, numberOfSections));<p id="jsresultsoutput"></p>
发布于 2019-04-07 05:42:38
你的代码几乎是正确的。你错过了一件事,你有一个不必要的filter。
缺失:在进行计数之前,您需要创建一个数字映射(1到numbersrange)。否则,0出现的数字就不会出现。我是这样做的
const mapOfNumbers = new Array(numbersrange + 1).fill(0).reduce((acc, _, i) => (acc[i] = 0, acc), {});
delete mapOfNumbers[0];额外:.filter(([k, v]) => v > 1)并不是必需的,因为您希望1和0也出现。
//Count how many times each number shows up
//const duplicateArr2 = [1, 1, 1, 1, 1, 100, 3, 5, 2, 5, 2, 23, 23, 23, 23, 23];
//const duplicateArr1 = [5, 3, 7, 4, 7, 5, 3, 2, 7, 3, 2];
//const duplicateArr2 = [4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,55,55,67,67,45,54,45,54];
//const duplicateArr2 = [4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,55,55,67,67,45,54,45,54,100,100,200,200,300,300];
//const duplicateArr2 = searchednumbers;
const duplicateArr2 = [4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 3, 7, 3, 3, 3, 1, 6, 6, 1, 1, 1, 1, 1, 7, 7, 7, 7, 6, 6, 5]
const getArrayOfDuplicated = (array, numbersrange) => {
const mapOfNumbers = new Array(numbersrange + 1).fill(0).reduce((acc, _, i) => (acc[i] = 0, acc), {});
delete mapOfNumbers[0];
const hash = array.reduce((a, c) => (a[c] = ++a[c] || 1, a), mapOfNumbers);
return Object.entries(hash)
.sort(([ak, av], [bk, bv]) => bv - av)
.reduce((a, [k, v]) => [...a, `${k} - ${v} times`], [])
};
// given a number of items to be sectioned into a certain number of groups
// returns a list of length nGroups with the number of items in each group
// such that at least (nGroups - 1) groups contain an equal number of items
// eg. getGrouping(10, 2) -> [5, 5]
// eg. getGrouping(10, 6) -> [1, 1, 1, 1, 1, 5]
const getGrouping = (nItems, nGroups) => {
if (nGroups > nItems)
return Array(nItems).fill(1);
else if (!(nItems % nGroups))
return Array(nGroups).fill(parseInt(nItems / nGroups));
else {
let numberOfEqualGroups = nGroups - 1;
var itemsPerEqualGroup;
if (!(nItems % (nGroups - 1)))
itemsPerEqualGroup = parseInt(nItems / (nGroups - 1)) - 1;
else
itemsPerEqualGroup = parseInt(nItems / (nGroups - 1));
equalGroups = Array(numberOfEqualGroups).fill(parseInt(itemsPerEqualGroup));
remainder = nItems - itemsPerEqualGroup * numberOfEqualGroups;
return equalGroups.concat(remainder);
}
}
// takes an array and formats it into sections according to grouping
// returns a string with a newline after each line and two new lines between sections
const formatGrouping = (array, grouping) => {
var outputString = ""
var linesDone = 0;
for (var section = 0; section < grouping.length; section++) {
for (var line = 0; line < grouping[section]; line++) {
outputString += array[linesDone] + '<br>';
linesDone += 1;
}
outputString += '<br>';
}
return outputString;
};
var numberOfSections = 3;
var numbersrange = 9;
result = getArrayOfDuplicated(duplicateArr2, numbersrange);
document.getElementById("jsresultsoutput").innerHTML = formatGrouping(result, getGrouping(result.length, numberOfSections));<p id="jsresultsoutput"></p>
另外,阅读关于你的问题的评论会给你一个完整的解决方案,你错过了。你可以说我已经把评论汇编成一个单一的答案。
https://stackoverflow.com/questions/55555356
复制相似问题