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;
    };
    
    

All Problems

All Solutions