- 作者: 负雪明烛
- id: fuxuemingzhu
- 个人博客: http://fuxuemingzhu.cn/
- 公众号:负雪明烛
- 本文关键词:Leetcode, 力扣,偶数,刷题,Python
题目地址:https://leetcode-cn.com/problems/finding-3-digit-even-numbers/
题目描述
给你一个整数数组 digits
,其中每个元素是一个数字(0 - 9)
。数组中可能存在重复元素。
你需要找出 所有 满足下述条件且 互不相同 的整数:
- 该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。
- 该整数不含 前导零
- 该整数是一个 偶数
例如,给定的 digits 是 [1, 2, 3] ,整数 132 和 312 满足上面列出的全部条件。
将找出的所有互不相同的整数按 递增顺序 排列,并以数组形式返回。
示例 1:
输入:digits = [2,1,3,0]
输出:[102,120,130,132,210,230,302,310,312,320]
解释:
所有满足题目条件的整数都在输出数组中列出。
注意,答案数组中不含有 奇数 或带 前导零 的整数。
示例 2:
输入:digits = [2,2,8,8,2]
输出:[222,228,282,288,822,828,882]
解释:
同样的数字(0 - 9)在构造整数时可以重复多次,重复次数最多与其在 digits 中出现的次数一样。
在这个例子中,数字 8 在构造 288、828 和 882 时都重复了两次。
示例 3:
输入:digits = [3,7,5]
输出:[]
解释:
使用给定的 digits 无法构造偶数。
示例 4:
输入:digits = [0,2,0,0]
输出:[200]
解释:
唯一一个不含 前导零 且满足全部条件的整数是 200 。
示例 5:
输入:digits = [0,0,0]
输出:[]
解释:
构造的所有整数都会有 前导零 。因此,不存在满足题目条件的整数。
提示:
3 <= digits.length <= 100
0 <= digits[i] <= 9
题目大意
从给定数组中抽取出来 3 个数字,组成的数字中,有哪些偶数。
解题方法
遍历
讲一下做这个题时我的心路历程。
第一反应,从给定数组中抽取 3 个数字,这是个组合问题。是不是可以任意抽取 3 个数字,再用全排列组成新数字,然后判断新数字是不是偶数?时间复杂度会很高,还要去重,最后还要按题目的要求进行排序。对于 Easy 题来说,这个做法太难了。
必须换个思路。
然后我就想,3 位的整数有多少个?只有 100~999
总共 900 个数字。我是不是看这 900 个数字能不能用题目给出的数组中的数字表示出来就行了?
也就是说遍历 100~999
总共 900 个数字,把每个数字拆解成 3 位,看这 3 位数字是不是题目给出数组的子集。
想到这里的时候,突然就明白了为什么题目要求我们返回的结果要去重,要排序了。因为这种做法天然就是去重并且排序的。去重和排序时题目给我们的提示!
子集怎么判断?所有判断子集的问题都用统计词频的方式去做啊!
代码很简单,在周赛的时候也只用 5 分钟就写出来了。
Python 代码如下:
class Solution(object):
def findEvenNumbers(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
counter = collections.Counter(digits)
res = []
for i in range(100, 1000, 2):
curCounter = collections.Counter(map(int,list(str(i))))
valid = True
for x in curCounter:
if curCounter[x] > counter[x]:
valid = False
break
if valid:
res.append(i)
return res
日期
2021 年 12 月 6 日 —— 看到别人家买的房子真好看