【LeetCode】5942. 找出 3 位偶数 Finding 3-Digit Even Numbers

目录

  • ​​题目描述​​
  • ​​题目大意​​
  • ​​解题方法​​
  • ​​遍历​​
  • ​​日期​​

题目描述

给你一个整数数组 ​​digits​​ ,其中每个元素是一个数字​​(0 - 9)​​。数组中可能存在重复元素。

你需要找出 所有 满足下述条件且 互不相同 的整数:

  • 该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。
  • 该整数不含 前导零
  • 该整数是一个 偶数

例如,给定leetcode是什么的 d寻找前世之旅igits 是 [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] 输出:[] 解释: 构造的所有整数都会有 前导零 。因此,不存在满足题目条件的整数。 

提示:

  1. ​3 <=寻找的近义词 digits寻找前世之旅小说.length <= 100​
  2. ​0 <系统运维主要做什么;= digits[i] <= 9​

题目大意

从给定数组中抽取出来 3 个数字,组成的数字力扣周赛中,有哪些偶数。

解题方法

遍历

讲一下做这个题时我的心路历偶数的定义程。

第一反应,算法的五个特性从给定数组中抽取 3 个数字,这是个组合问题。是不是可以任意抽取 3 个寻找的英文数字,再用全排列组成新数字,然后判断leetcode每日一题新数字是不是其他综合收益偶数?时间复杂度会很高,还要去重,最后还要按题目的要求进排序。对于 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

日期