Home 找出 3 位偶数
Post
Cancel

找出 3 位偶数

前言

今天是开始刷力扣的第一天,为了锻炼代码能力,备战明年实习。由于对 Java 语言掌握不熟练,常出现“有思路却写不出来”的问题,因此记录刷题过程中遇到的不懂知识点和收获,鼓励自己坚持下去!


原题:找出 3 位偶数

题目描述:

给你一个整数数组 digits,其中每个元素是一个数字(0 - 9),数组中可能存在重复元素。你需要找出所有满足以下条件且互不相同的三位整数:

  1. digits 中任意顺序的三个元素组成;
  2. 不含前导零;
  3. 是一个偶数。

返回这些整数按升序排列组成的数组。

示例:

1
2
3
4
5
6
7
8
输入:digits = [2,1,3,0]
输出:[102,120,130,132,210,230,302,310,312,320]

输入:digits = [2,2,8,8,2]
输出:[222,228,282,288,822,828,882]

输入:digits = [3,7,5]
输出:[]

关键知识点

Set set = new HashSet<>();

  • Set 是 Java 集合框架的一部分,表示无序且不重复的元素集合。
  • 泛型 <Integer> 指明 Set 只存整型对象。
  • HashSet 是 Set 的常用实现,基于哈希表,增删查平均时间复杂度为 O(1)。
  • Java 7 起支持“钻石语法”:new HashSet<>()

if (h == 0) continue;

  • continue; 会跳过当前循环的后续语句,直接进入下一次迭代。

逻辑或:k == i || k == j

  • || 表示逻辑或(OR),只要其中一边为真,整个表达式即为真。

判断偶数: (u & 1) == 0 等价于 u % 2 == 0

  • & 是按位与运算:
    • 5 & 10101 & 0001 = 0001 → 1(奇数)
    • 4 & 10100 & 0001 = 0000 → 0(偶数)

从 Set 到排序后的 int[]

1
2
3
4
5
6
7
List<Integer> ans = new ArrayList<>(set);
Collections.sort(ans);
int[] res = new int[ans.size()];
for (int i = 0; i < ans.size(); i++) {
    res[i] = ans.get(i);
}
return res;

说明:

  • ArrayList<>(set):从 Set 构造一个可排序的 List。
  • Collections.sort(ans):默认按自然顺序(升序)排序。
  • ans.get(i) 自动拆箱成 int,放入结果数组。

简洁写法:ans.stream().mapToInt(i -> i).toArray()

  • .stream():转为 Stream 对象;
  • .mapToInt(i -> i):Lambda 表达式将每个 Integer 拆箱成 int;
  • .toArray():将 Stream 转换成 int[] 数组。

增强 for 循环:for (int d : digits)

  • 每轮将 digits 中的下一个元素赋值给局部变量 d

剪枝条件优化

1
2
3
4
5
6
7
if (cnt[d] > 0
    && ((i == 0 && d > 0)          // 百位不能为0
        || (i == 1)                // 十位可以为任意0-9
        || (i == 2 && d % 2 == 0)  // 个位必须为偶数
    )) {
    // 选中 d,递归或构造数
}

解释:

  1. cnt[d] > 0:数字 d 尚有剩余次数可用;
  2. i == 0 && d > 0:构造三位数首位不能是0;
  3. i == 1:中间位无限制;
  4. i == 2 && d % 2 == 0:末尾位必须为偶数。

This post is licensed under CC BY 4.0 by the author.