算法题中集合方法使用

Map

  • map存取操作,对于cnt我想要取出来 key = x的value值, 如果我直接使用get(x),如果x没有存在就会返回null,容易产生空指针报错,所以要么使用if-else 判断,使用 containsKey(x)判断是否存在这个key,或者直接使用 cnt.getOrDefault(x, 0),如果不存在就返回0,或者更直接 cnt.merge(x, 1, Integer::sum),如果x不存在就直接设置为1 , 如果 x 存在就进行合并,最后实现了 cnt[x]++;

  • 关键方法:

    • cnt.values(),获取 Map 里所有的值(value)返回:Collection
    • cnt.keySet(),获取 Map 里所有的键(key)返回:Set
    • cnt.entrySet(),获取 所有的 键值对(key+value),返回:Set<Map.Entry<Integer, Integer>>
    • cnt.containsValue(value),判断是否包含这个 value
    • map.computeIfAbsent(key, 映射函数)先看 map 里有没有这个 key,有:直接返回这个 key 对应的 value,没有:执行 lambda 新建一个
  • 遍历模版:

for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) {
    int key = entry.getKey();
    int value = entry.getValue();
}

List + 数组 + String

  • 二维动态数组:List[] buckets = new ArrayList[maxCnt + 1]; 一维设置了 maxCnt + 1个大小,内部现在还是空,需要我们自己设置,可以使用for循环 new ArrayList<>()填充内部,或者 new ArrayList<>(10) 使得内部大小也被固定。Arrays.setAll(buckets, _ -> new ArrayList<>()); 使用 Arrays.setAll工具直接设置。
  • l e e t c o d e 这个方法 s.substring(4,8),截取左闭右开,截取 4~7 字符 → "code"
    0 1 2 3 4 5 6 7
  • 对于 String 字符串计算长度 s.length()需要加括号,因为 String 是类,使用的是成员类方法,但是数组 nums.lenth;就不需要加。
  • 当算法中频繁使用contains判断是否存在的时候,List底层要么是 ArrayList数组,要么是 LinkedList 是链表,要想判断是否存在,就需要循环遍历,所以可以把 List 转换成 Set,使用 Hash 查询,从而变成 O(1)时间复杂度。
  • String sortedS = Arrays.stream(s.split("")).sorted().collect(Collectors.joining()); 流操作。把String字符串拆成字符数组形成流,然后把数组进行排序,最后收集形成一个新的字符串。就相当于把 String 转换成字符数组然后直接排序即可。
  • Arrays.sort(intervals, (p, q) -> Integer.compare(p[0], q[0])); 根据p由小到大排序。
posted @ 2026-04-27 14:57  Huangyien  阅读(3)  评论(0)    收藏  举报