JavaScript - 从给定数组打印直方图



//给定一个整数数组 [2, 1, 2, 101, 4, 95, 3, 250, 4, 1, 2, 2, 7, 98, 123, 99, ...]

我正在尝试编写一个函数(具有线性运行时复杂性(来打印以下带有类似于直方图的"xxx"的表格输出(输出应与下面的示例输出紧密匹配,包括"99+"以捕获所有数字> 99 的计数(:

Num | count
1 | xx
2 | xxxx
3 | x
4 | xx

98 | x 99 |x 99+|xxx

const dict = {}; // Empty dictionary
var min = Number.MAX_VALUE;
const maxRange = 5; // elements above maxRange will be clubbed in the same range.
//var arr = [2, 1, 2, 101, 4, 95, 3, 250, 4, 1, 2, 2, 7, 98, 123, 99];
const arr = [1, 2, 5, 3, 2, 2, 1, 5, 5, 6, 7, 1, 8, 10, 11, 12];
// iterate the array and set and update the counter in map
arr.forEach(function(num) {
  min = Math.min(min, num); // find min
  if (num > maxRange) {
    num = maxRange + 1;
  }
  dict[num] = dict[num] ? dict[num] + 1 : 1;
});
console.log("Num | Count");
// Print the occurrences per item in array starting from min to max
while (min <= maxRange + 1) {
  if (!dict[min]) { // print only those numbers which are defined in dictionary
    min++;
    continue;
  }
  var xArr = []
  var range = dict[min];
  for (i = 0; i < range; i++) {
    xArr.push('x');
  }
  var disp = (min <= maxRange) ? (min + "   | " + xArr.join("")) : (maxRange + "+  | " + xArr.join(""));
  console.log(disp);
  min = min + 1;
}

您可能想尝试使用 forEach(( 方法遍历数组。 然后创建一个"x"的数组,只要数组中的当前项。然后使用 join 方法将数组联接到 x 的字符串中。

我还没有包括如何处理超过 99 的数字,但我认为这应该足以让你入门。解决方案将涉及使用条件语句来检查数字是否高于 99 并相应地打印。

我从我的示例中得到了以下输出:

Num | Count
2 ' |' 'xx'
4 ' |' 'xxxx'
6 ' |' 'xxxxxx'
8 ' |' 'xxxxxxxx'

玩得愉快!

var arr = [2,4,6,8]
printHistogram = (array) => {
  console.log("Num", '|', "Count")
  array.forEach((x, i) => { //iterate over the array (x = current item, i = index)
    var arrToJoin =[] //create an empty array
    for(i = 0; i < x; i++) {
      arrToConcat.push('x') //add an "x" to the array
    }
    console.log(i, ' |', arrToConcat.join(''))
  })
}
printHistogram(arr)

这个怎么样?

创建一个名为arrToCompare的所有唯一数字的数组

然后遍历该数组并将每个数字与原始数组中的每个数字进行比较。如果它们相等,则将 x 推到数组进行连接。加入它并使用适当的符号记录它。

var arr = [7, 7, 8, 9, 2,4,6,8,2]
printHistogram = (array) => {
  var arrToCompare =[]
  console.log("Num", '|', "Count")
  array.forEach((x, i) => {
    arrToCompare.includes(x) ? "" : arrToCompare.push(x)
  })
  arrToCompare.forEach(function(x) {
    var arrToJoin = []
    array.forEach(function(i) {
      if(i === x) {
        arrToJoin.push('x')
      }
    })
    console.log(x, '|', arrToJoin.join(''))
  })
}
printHistogram(arr)

最新更新