diff options
-rw-r--r-- | finding_3_digit_even_num.c | 59 | ||||
-rw-r--r-- | finding_3_digit_even_num.py | 32 | ||||
-rw-r--r-- | three_consecutive_odds.c | 8 | ||||
-rw-r--r-- | three_consecutive_odds.py | 10 |
4 files changed, 104 insertions, 5 deletions
diff --git a/finding_3_digit_even_num.c b/finding_3_digit_even_num.c new file mode 100644 index 0000000..be8c065 --- /dev/null +++ b/finding_3_digit_even_num.c @@ -0,0 +1,59 @@ +// 2094. Finding 3-Digit Even Numbers +#include "leetcode.h" + +/* + * you are given an integer '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, and the integer is even. for example, if the given 'digits' + * were '[1, 2, 3]' integers '132' and '312' follow the requirments. return a + * sorted array of the unique integers. + */ + +int *findEvenNumbers(int *digits, int digitsSize, int *returnSize) { + int hash[10] = {0}; + for (int i = 0; i < digitsSize; i++) + hash[digits[i]]++; + int *ans = (int *)malloc(sizeof(int)); + *returnSize = 0; + int idx = 0; + for (int i = 100; i < 999; i += 2) { + int cnt[10] = {0}, tmp = i; + bool flag = true; + while (tmp) { + cnt[tmp % 10]++; + tmp /= 10; + } + for (int j = 0; j < 10; j++) + if (cnt[j] > hash[j]) { + flag = false; + break; + } + if (flag) { + (*returnSize)++; + ans = (int *)realloc(ans, (*returnSize) * sizeof(int)); + ans[idx++] = i; + } + } + return ans; +} + +int main() { + int d1[] = {2, 1, 3, 0}, d2[] = {2, 2, 8, 8, 2}, d3[] = {3, 7, 5}; + int rs1, *fen1 = findEvenNumbers(d1, ARRAY_SIZE(d1), &rs1); + int rs2, *fen2 = findEvenNumbers(d2, ARRAY_SIZE(d2), &rs2); + int rs3, *fen3 = findEvenNumbers(d3, ARRAY_SIZE(d3), &rs3); + for (int i = 0; i < rs1; i++) + printf("%d ", fen1[i]); // expect: 102,120,130,132,210,230,302,310,312,320 + printf("\n"); + for (int i = 0; i < rs2; i++) + printf("%d ", fen2[i]); // expect: 222,228,282,288,822,828,882 + printf("\n"); + for (int i = 0; i < rs3; i++) + printf("%d ", fen3[i]); // expect: null + printf("\n"); + free(fen1); + free(fen2); + free(fen3); +} diff --git a/finding_3_digit_even_num.py b/finding_3_digit_even_num.py new file mode 100644 index 0000000..cf6ccc7 --- /dev/null +++ b/finding_3_digit_even_num.py @@ -0,0 +1,32 @@ +# 2094. Finding 3-Digit Even Numbers +from itertools import permutations + +""" +you are given an integer '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, and the integer is even. for example, if the given 'digits' +were '[1, 2, 3]' integers '132' and '312' follow the requirments. return a +sorted array of the unique integers. +""" + + +class Solution(object): + def findEvenNumbers(self, digits): + """ + :type digits: List[int] + :rtype: List[int] + """ + return sorted( + 100 * v + 10 * u + w + for v, u, w in {*permutations(digits, 3)} + if v > 0 == w & 1 + ) + + +if __name__ == "__main__": + obj = Solution() + print(obj.findEvenNumbers(digits=[2, 1, 3, 0])) + print(obj.findEvenNumbers(digits=[2, 2, 8, 8, 2])) + print(obj.findEvenNumbers(digits=[3, 7, 5])) diff --git a/three_consecutive_odds.c b/three_consecutive_odds.c index 1f65dd4..9885dd2 100644 --- a/three_consecutive_odds.c +++ b/three_consecutive_odds.c @@ -7,10 +7,10 @@ */ bool threeConsecutiveOdds(int *arr, int arrSize) { - int odds = 0; - for (int i = 0; i < arrSize && odds < 3; ++i) - odds = arr[i] % 2 ? odds + 1 : 0; - return odds == 3; + for (int i = 1; i < arrSize - 1; ++i) + if (1 & arr[i - 1] & arr[i] & arr[i + 1]) + return true; + return false; } int main() { diff --git a/three_consecutive_odds.py b/three_consecutive_odds.py index 62fafe3..7abb6bb 100644 --- a/three_consecutive_odds.py +++ b/three_consecutive_odds.py @@ -12,7 +12,15 @@ class Solution(object): :type arr: List[int] :rtype: bool """ - return "111" in "".join([str(i % 2) for i in arr]) + cnt = 0 + for i in arr: + if i % 2 != 0: + cnt += 1 + if cnt == 3: + return True + else: + cnt = 0 + return False if __name__ == "__main__": |