LeetCode 题解工作台

分组

请你编写一段可应用于所有数组的代码,使任何数组调用 array. groupBy(fn) 方法时,它返回对该数组 分组后 的结果。 数组 分组 是一个对象,其中的每个键都是 fn(arr[i]) 的输出的一个数组,该数组中含有原数组中具有该键的所有项。 提供的回调函数 fn 将接受数组中的项并返回一…

category

0

题型

code_blocks

1

代码语言

hub

0

相关题

当前训练重点

中等 · Group By core interview pattern

bolt

答案摘要

declare global { interface Array<T> {

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 Group By core interview pattern 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

请你编写一段可应用于所有数组的代码,使任何数组调用 array. groupBy(fn) 方法时,它返回对该数组 分组后 的结果。

数组 分组 是一个对象,其中的每个键都是 fn(arr[i]) 的输出的一个数组,该数组中含有原数组中具有该键的所有项。

提供的回调函数 fn 将接受数组中的项并返回一个字符串类型的键。

每个值列表的顺序应该与元素在数组中出现的顺序相同。任何顺序的键都是可以接受的。

请在不使用 lodash 的 _.groupBy 函数的前提下解决这个问题。

 

示例 1:

输入:
array = [
  {"id":"1"},
  {"id":"1"},
  {"id":"2"}
], 
fn = function (item) { 
  return item.id; 
}
输出:
{ 
  "1": [{"id": "1"}, {"id": "1"}],   
  "2": [{"id": "2"}] 
}
解释:
输出来自函数 array.groupBy(fn)。
分组选择方法是从数组中的每个项中获取 "id" 。
有两个 "id" 为 1 的对象。所以将这两个对象都放在第一个数组中。
有一个 "id" 为 2 的对象。所以该对象被放到第二个数组中。

示例 2:

输入:
array = [
  [1, 2, 3],
  [1, 3, 5],
  [1, 5, 9]
]
fn = function (list) { 
  return String(list[0]); 
}
输出:
{ 
  "1": [[1, 2, 3], [1, 3, 5], [1, 5, 9]] 
}
解释:
数组可以是任何类型的。在本例中,分组选择方法是将键定义为数组中的第一个元素。
所有数组的第一个元素都是1,所以它们被组合在一起。
{
  "1": [[1, 2, 3], [1, 3, 5], [1, 5, 9]]
}

示例 3:

输出:
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
fn = function (n) { 
  return String(n > 5);
}
输入:
{
  "true": [6, 7, 8, 9, 10],
  "false": [1, 2, 3, 4, 5]
}
解释:
分组选择方法是根据每个数字是否大于 5 来分割数组。

 

提示:

  • 0 <= array.length <= 105
  • fn 返回一个字符串
lightbulb

解题思路

方法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
declare global {
    interface Array<T> {
        groupBy(fn: (item: T) => string): Record<string, T[]>;
    }
}

Array.prototype.groupBy = function (fn) {
    return this.reduce((acc, item) => {
        const key = fn(item);
        if (acc[key]) {
            acc[key].push(item);
        } else {
            acc[key] = [item];
        }
        return acc;
    }, {});
};

/**
 * [1,2,3].groupBy(String) // {"1":[1],"2":[2],"3":[3]}
 */
speed

复杂度分析

指标
时间complexity is O(n) because each element is visited once to compute its key. Space complexity is O(n) as a new object stores references to all original elements grouped by their keys.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Ask candidate to explain how keys are generated and handled if duplicates occur.

  • question_mark

    Check if candidate preserves the original element references in the grouped arrays.

  • question_mark

    Probe edge cases like empty arrays or unusual fn outputs to verify robust handling.

warning

常见陷阱

外企场景
  • error

    Overwriting arrays for duplicate keys instead of appending elements.

  • error

    Returning a modified input array rather than a new grouped object.

  • error

    Not converting keys to strings consistently when fn returns non-string values.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Group elements by multiple keys by allowing fn to return an array of keys for each item.

  • arrow_right_alt

    Implement a stable Group By where insertion order of items is preserved in each array.

  • arrow_right_alt

    Create a version that groups asynchronously if fn involves async computation.

help

常见问题

外企场景

分组题解:Group By core interview… | LeetCode #2631 中等