给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。
你需要找出 所有 满足下述条件且 互不相同 的整数:
- 该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。
- 该整数不含 前导零
- 该整数是一个 偶数
例如,给定的 digits 是 [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 无法构造偶数。
提示:
3 <= digits.length <= 100
0 <= digits[i] <= 9
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/finding-3-digit-even-numbers
2.题解--暴力解法
/**
* @param {number[]} digits
* @return {number[]}
*/
var findEvenNumbers = function(digits) {
let list=digits
const res=[]
let number
// 最后一位
for(let i=0;i<list.length;i++){
if(list[i]%2==0||list[i]==0){
// 第一位
for(let j=0;j<list.length;j++){
// 第一位不能为0 也不能等于最后一位
if(list[j]!=0&&i!=j){
// 中间的就是剩下的遍历
for(let k=0;k<list.length;k++){
if(k!=j&&k!=i){
if(list[k]==0){
number=list[j]*100+list[i]
}else{
number=list[j]*100+list[k]*10+list[i]
}
res.push(number);
}
}
}
}
}
}
return Array.from(new Set(res.sort()))
}
先确定最后一位 是偶数
判断第一位不能是0
剩下的放中间
最后注意去重
3.非暴力解法
var findEvenNumbers = function(digits) {
const result = [];
const counts = new Array(10).fill(0);
for (const digit of digits) {
counts[digit]++;
}
// 我们只关心没有前导零的 3 位偶数 所以我们可以从 100 开始并增加 2 直到达到 1000
// 这样解决了从小到大排序的问题呢
for (let num = 100; num < 1000; num += 2) {
let number = num;
const onesDigit = number % 10; // 个位数
number = Math.floor(number / 10);
const tensDigit = number % 10; // 十位数
number = Math.floor(number / 10);
const hundredsDigit = number; // 千位数
// 每次我们使用一个数字时,我们都会更新我们的计数
counts[onesDigit]--;
counts[tensDigit]--;
counts[hundredsDigit]--;
// 检查我们是否有足够的每个数字来构造数字
if (counts[onesDigit] >= 0 && counts[tensDigit] >= 0 && counts[hundredsDigit] >= 0)
result.push(num);
// 因为单个数字可以重复,需要恢复原始计数,
counts[onesDigit]++;
counts[tensDigit]++;
counts[hundredsDigit]++;
}
return result;
};
作者:githubgankai
链接:https://leetcode.cn/problems/finding-3-digit-even-numbers/solution/jian-dan-yi-dong-de-dai-ma-cai-shi-hao-d-lwbd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。