当前位置: 首页 > article >正文

【力扣】2094.找出3为偶数

思路

方法一:使用Set集合

1.首先是三层for循环,遍历,并且遇到不满足的情况,便跳过,继续计算。不如前导为0,以及遍历同一个数组下标的情况 2.使用Set集合来确保答案是唯一的,使用桶来标记也是可以的 3.但是使用了Set集合就要将其转换为数组来返回,因为题目要求返回的是数组,并且也要用到一些Set的方法。
class Solution {

    public int[] findEvenNumbers(int[] digits) {

        Set<Integer> resultSet = new HashSet<>();

        int len = digits.length;

        for (int i = 0; i < len; i++) {

            if (digits[i] == 0) continue;

            for (int j = 0; j < len; j++) {

                if (j == i) continue;

                for (int k = 0; k < len; k++) {

                    if (k == i || k == j || digits[k] % 2 != 0) continue;

                    resultSet.add(digits[i] * 100 + digits[j] * 10 + digits[k]);

                }

            }

        }

        //将Set集合转为List

        List<Integer> res = new ArrayList<>(resultSet);

        Collections.sort(res);

        int[] resultArray = new int[res.size()];

        for (int i = 0; i < res.size(); i++) {

            resultArray[i] = res.get(i);

        }

        return resultArray;

    }

}

通过情况:

方法二:使用数字标记

1.因为是三位的偶数,所以只要大小为1k的数字即可

2.前面的判断条件都是一样的,不满足的情况就跳过

3.不同的是,因为不是Set集合,没有办法自动去重,但是好在范围只在100~999的偶数即可,所以i+=2

4.因为不知道有多少满足条件的数字,所以仍然使用List集合,并且在得到结果后再转为数组。

class Solution {

    public int[] findEvenNumbers(int[] digits) {

        int[] res=new int[1000];

        int len = digits.length;

        for (int i = 0; i < len; i++) {

            if (digits[i] == 0) continue;

            for (int j = 0; j < len; j++) {

                if (j == i) continue;

                for (int k = 0; k < len; k++) {

                    if (k == i || k == j || digits[k] % 2 != 0||res[digits[i] * 100 + digits[j] * 10 + digits[k]]!=0) continue;

                    res[digits[i] * 100 + digits[j] * 10 + digits[k]]++;

                }

            }

        }

        List<Integer> resultList=new ArrayList<>();

        for (int i = 100; i <999 ; i+=2) {

            if(res[i]!=0)

                resultList.add(i);

        }

        int[] resultArray = new int[resultList.size()];

        for (int i = 0; i < resultList.size(); i++) {

            resultArray[i] = resultList.get(i);

        }

        return resultArray;

    }

}

通过情况:

方法三:直接对0~9出现的数字进行标记

1.既然方法二用的数组标记,是对100-999中的进行标记。那么还有没有更简便的方法呢?

2.直接对0-9的数字进行标记,出现了,则++

3.并且i从1开始,这样就可以避免前导0的问题,k+=2,就能确保找到的都是偶数

4.计算的时候暂时减去使用的次数,这是为了防止,后面的位数进行多次的使用,如果次数不足的情况下。计算完成后再加回来,因为便利和出现的次数无关,遍历是从0~9开始的遍历,如果数字不存在,则会跳过。

5.最后仍是将List转化为 int[ ],返回

class Solution {

    public int[] findEvenNumbers(int[] digits) {

        // 创建一个长度为10的数组cnt来记录digits中各个数字(0-9)出现的次数

        int[] cnt = new int[10];

        for (int d : digits) {

            cnt[d]++; // 统计每个数字出现的次数

        }

        // 创建一个列表list用于存储找到的所有符合条件的三位偶数

        List<Integer> list = new ArrayList<>();

        // 外层循环遍历可能的百位数字i (从1到9,避免前导零)

        for (int i = 1; i < 10; i++) {

            if (cnt[i] == 0) continue; // 如果该数字不存在于digits中,则跳过

            // 暂时减少百位数字i的计数,表示它已经被使用

            cnt[i]--;

            // 中间层循环遍历可能的十位数字j (从0到9)

            for (int j = 0; j < 10; j++) {

                if (cnt[j] == 0) continue; // 如果该数字不存在于digits中,则跳过

                // 暂时减少十位数字j的计数,表示它已经被使用

                cnt[j]--;

                // 内层循环遍历可能的个位数字k (从0到9,步长为2,确保是偶数)

                for (int k = 0; k < 10; k += 2) {

                    if (cnt[k] > 0) { // 如果该偶数存在于digits中

                        // 构建三位数并添加到结果列表中

                        list.add(100 * i + 10 * j + k);

                    }

                }

                // 恢复十位数字j的计数

                cnt[j]++;

            }

            // 恢复百位数字i的计数

            cnt[i]++;

        }

        // 将结果列表转换为数组

        int[] nums = new int[list.size()];

        for (int i = 0; i < list.size(); i++) {

            nums[i] = list.get(i);

        }

        // 返回结果数组

        return nums;

    }

}


http://www.kler.cn/a/428733.html

相关文章:

  • 工业相机 SDK 二次开发-Halcon 插件
  • Dart语言的学习路线
  • 函数递归的介绍
  • 【Leetcode 热题 100】45. 跳跃游戏 II
  • 金仓Kingbase客户端KStudio报OOM:Java heap space socketTimeout
  • 移远通信多模卫星通信模组BG95-S5获得Skylo网络认证,进一步拓展全球卫星物联网市场
  • 【Leetcode 每日一题】3001. 捕获黑皇后需要的最少移动次数
  • 【CSS in Depth 2 精译_066】11.2 颜色的定义(上):实现示例页中的基础样式及初步布局
  • vim实用命令整理(常用的命令)
  • mybatis plus打印sql日志
  • Apache Doris 数据类型
  • 海报在线制作系统海报制作小程序PHP+Uniapp
  • Elasticsearch:使用 Elastic APM 监控 Android 应用程序
  • SPT: Revisiting the Power of Prompt for Visual Tuning
  • 【jvm】垃圾回收的重点区域
  • 【Linux内核】Hello word程序
  • AIGC实战——VQ-GAN(Vector Quantized Generative Adversarial Network)
  • C# (WinForms) 使用 iTextSharp 库将图片转换为 PDF
  • 分布式数据库:架构、挑战与未来趋势
  • MATLAB 控制系统快速入门
  • 期货分仓/风控/期货交易的原则!
  • Ubuntu系统中Redis的安装步骤及服务配置
  • Rust学习笔记_13——枚举
  • Ubuntu 22.04安装Nessus(离线激活模式)
  • Windows如何识别Linux主机名?
  • 力扣-图论-3【算法学习day.53】