【LeetCode】5942. 3桁の偶数を求める

  • 著者:ネガティブスノーキャンドル
  • ID:福明珠
  • 個人ブログ: http://fuxuemingzhu.cn/
  • 公式アカウント:ネガティブスノーブライトキャンドル
  • この記事のキーワード:リートコード、リートコード、偶数、筆問題、Python

トピックのアドレス: https://leetcode-cn.com/problems/finding-3-digit-even-numbers/

トピックの説明

digits各要素が数値である整数の配列が与えられます(0 - 9)配列内に重複した要素が存在する可能性があります。

次の条件を満たし、互いに異なる整数をすべて見つける必要があります

  • 整数は、任意の順序で連続的に連結された数字の 3 つの要素で構成されます。
  • 整数には先行ゼロがありません
  • 整数は偶数です

たとえば、与えられた数字が [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つの数字を任意に抽出し、完全な配置を使用して新しい数字を形成し、その新しい数字が偶数であるかどうかを判断することは可能ですか? 時間の計算量は非常に高くなるため、重複を削除し、最後にトピックの要件に従って並べ替える必要があります。簡単な質問の場合、このアプローチは難しすぎます。

私たちは考え方を変えなければなりません。

そこで、3 桁の整数はいくつあるだろうかと考えました。数字は全部で900しかありません100~999これらの 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 日 - 他の人が家を購入するのを見るのは嬉しいことです

おすすめ

転載: blog.csdn.net/fuxuemingzhu/article/details/121758678