题解 | #牛棚品种分类#

牛棚品种分类

https://www.nowcoder.com/practice/0b6068f804b9426aa737ea8606e8d5c3

知识点:哈希表

思路:

  1. 创建一个 Map 对象 mp 用于存储分组的结果,其中键为长度为 26 的整型数组 int[],值为字符串列表 List<String>
  2. 遍历字符串列表 strs,对于每个字符串 s,通过调用 get(s) 方法获取其对应的长度为 26 的整型数组作为键,并将该字符串加入到相应的值列表中。
  3. 创建一个列表 keys,用于存储 mp 中的键。
  4. 对 keys 进行排序,排序规则是按照每个键对应的值列表中的第一个字符串进行比较。
  5. 创建一个新的 Map 对象 res 用于存储最终的分组结果。
  6. 遍历排序后的 keys,将每个键对应的值列表加入到 res 中。
  7. 返回 res,即为分组后的结果。

编程语言:java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param strs string字符串一维数组 
     * @return string字符串一维数组
     */
  public static String[] groupAnagrams(String[] strs) {
        Map<String, List<String>> mp = new HashMap<>();

        for (String s : strs) {
            String key = getKey(s);
            List<String> group = mp.getOrDefault(key, new ArrayList<>());
            group.add(s);
            mp.put(key, group);
        }

        List<String> result = new ArrayList<>();
        for (List<String> group : mp.values()) {
            group.sort(String::compareTo); // 对每个分组进行升序排序
            result.add(join(group));
        }
        
        result.sort(String::compareTo); // 对整个结果进行升序排序

        return result.toArray(new String[0]);
    }

    public static String getKey(String s) {
        char[] arr = s.toCharArray();
        Arrays.sort(arr);
        return new String(arr);
    }

    public static String join(List<String> group) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < group.size(); i++) {
            sb.append(group.get(i));
            if (i < group.size() - 1) {
                sb.append(",");
            }
        }
        return sb.toString();
    }
}

全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务