首页 > 解决方案 > 坚持如何从打字稿中的数组计算模式

问题描述

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

我正在使用程序 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 语句来在必要时更改模式,但我不确定除此之外。

标签: javascripttypescript

解决方案


正如你所指出的:你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;
}

推荐阅读