陷入如何从打字稿中的数组计算模式的问题

时间:2018-10-25 21:44:23

标签: javascript typescript

我遇到了一个问题,我应该从打字稿中的数组中找出一个模式。

我正在使用Visual Studio Code程序,并且我知道我需要一个for循环,但是我不确定应该通过它循环什么。我还必须确保,如果数组为空,则始终显示的数字为0,并且如果有两个整数显示相同的时间,则较小的数字(无论是正数还是负数)是被设置为模式。

当前,我有这部分代码:

export let mode = (a: number[]): number => {

    let mode: number;

    mode = a[0];
    if (a.length === 0) {
        return 0;
    }
    for (let i = 1; i < a. length; i++) {
        if ()

        return mode;
};

我知道在for循环后需要一个if语句,该语句可以在必要时更改模式,但是我不确定。

1 个答案:

答案 0 :(得分:0)

如您所述:mode应该是以下功能:

  • 接受数字数组,并应返回出现次数最高的数字。
  • 如果有两个或两个以上的数字具有最高的出现率,则应返回值最小的数字。
  • 如果给定数组为空,则应返回0。

您可以这样做:

  1. 如果给定数组为空,则立即返回0。否则,请继续执行其余的步骤。
  2. 计算数组中每个数字的出现次数。
  3. 按出现次数和值对#2的结果进行排序。按出现次数最高的,然后是最低的值排序。
  4. 从#3获取第一个项目。

这是一个使用reduce()执行步骤#2,使用sort()执行步骤#3的实现。

let mode = (numbers: number[]): number => {

    if (numbers.length === 0) {
        return 0;
    }

    const m = numbers.reduce((items, current) => {
        const item = (items.length === 0) ? null : items.find((x) => x.value === current);
        (item) ? item.occurrence++ : items.push({ value: current, occurrence: 1 });
        return items;
    }, [])
    .sort((a, b) => {
        if (a.occurrence < b.occurrence) {
            return 1;
        } else if (a.occurrence > b.occurrence || a.value < b.value) {
              return -1;
        } else {
            return (a.value === b.value) ? 0 : 1;
        }
    });

    return m[0].value;
}