Welcome to Subscribe On Youtube
2094. Finding 3-Digit Even Numbers
Description
You are given an integer array digits
, where each element is a digit. The array may contain duplicates.
You need to find all the unique integers that follow the given requirements:
- The integer consists of the concatenation of three elements from
digits
in any arbitrary order. - The integer does not have leading zeros.
- The integer is even.
For example, if the given digits
were [1, 2, 3]
, integers 132
and 312
follow the requirements.
Return a sorted array of the unique integers.
Example 1:
Input: digits = [2,1,3,0] Output: [102,120,130,132,210,230,302,310,312,320] Explanation: All the possible integers that follow the requirements are in the output array. Notice that there are no odd integers or integers with leading zeros.
Example 2:
Input: digits = [2,2,8,8,2] Output: [222,228,282,288,822,828,882] Explanation: The same digit can be used as many times as it appears in digits. In this example, the digit 8 is used twice each time in 288, 828, and 882.
Example 3:
Input: digits = [3,7,5] Output: [] Explanation: No even integers can be formed using the given digits.
Constraints:
3 <= digits.length <= 100
0 <= digits[i] <= 9
Solutions
-
class Solution { public int[] findEvenNumbers(int[] digits) { int[] counter = count(digits); List<Integer> ans = new ArrayList<>(); for (int i = 100; i < 1000; i += 2) { int[] t = new int[3]; for (int j = 0, k = i; k > 0; ++j) { t[j] = k % 10; k /= 10; } int[] cnt = count(t); if (check(counter, cnt)) { ans.add(i); } } return ans.stream().mapToInt(Integer::valueOf).toArray(); } private boolean check(int[] cnt1, int[] cnt2) { for (int i = 0; i < 10; ++i) { if (cnt1[i] < cnt2[i]) { return false; } } return true; } private int[] count(int[] nums) { int[] counter = new int[10]; for (int num : nums) { ++counter[num]; } return counter; } }
-
class Solution { public: vector<int> findEvenNumbers(vector<int>& digits) { vector<int> counter = count(digits); vector<int> ans; for (int i = 100; i < 1000; i += 2) { vector<int> t(3); for (int j = 0, k = i; k > 0; ++j) { t[j] = k % 10; k /= 10; } vector<int> cnt = count(t); if (check(counter, cnt)) ans.push_back(i); } return ans; } vector<int> count(vector<int>& nums) { vector<int> counter(10); for (int num : nums) ++counter[num]; return counter; } bool check(vector<int>& cnt1, vector<int>& cnt2) { for (int i = 0; i < 10; ++i) if (cnt1[i] < cnt2[i]) return false; return true; } };
-
class Solution: def findEvenNumbers(self, digits: List[int]) -> List[int]: ans = [] counter = Counter(digits) for i in range(100, 1000, 2): t = [] k = i while k: t.append(k % 10) k //= 10 cnt = Counter(t) if all([counter[i] >= cnt[i] for i in range(10)]): ans.append(i) return ans
-
func findEvenNumbers(digits []int) []int { counter := count(digits) var ans []int for i := 100; i < 1000; i += 2 { t := make([]int, 3) k := i for j := 0; k > 0; j++ { t[j] = k % 10 k /= 10 } cnt := count(t) if check(counter, cnt) { ans = append(ans, i) } } return ans } func count(nums []int) []int { counter := make([]int, 10) for _, num := range nums { counter[num]++ } return counter } func check(cnt1, cnt2 []int) bool { for i := 0; i < 10; i++ { if cnt1[i] < cnt2[i] { return false } } return true }
-
function findEvenNumbers(digits: number[]): number[] { let record = new Array(10).fill(0); for (let digit of digits) { record[digit]++; } let ans = []; for (let i = 100; i < 1000; i += 2) { if (check(record, String(i))) { ans.push(i); } } return ans; } function check(target: Array<number>, digits: string): boolean { let record = new Array(10).fill(0); for (let digit of digits) { record[digit]++; } for (let i = 0; i < 10; i++) { if (record[i] > target[i]) return false; } return true; }
-
/** * @param {number[]} digits * @return {number[]} */ var findEvenNumbers = function (digits) { const cnt = Array(10).fill(0); for (const x of digits) { ++cnt[x]; } const ans = []; for (let x = 100; x < 1000; x += 2) { const cnt1 = Array(10).fill(0); for (let y = x; y; y = Math.floor(y / 10)) { ++cnt1[y % 10]; } let ok = true; for (let i = 0; i < 10 && ok; ++i) { ok = cnt[i] >= cnt1[i]; } if (ok) { ans.push(x); } } return ans; };