2094.找出3位偶数--JavaScript

8 篇文章 0 订阅
4 篇文章 0 订阅

给你一个整数数组 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值