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

经典笔试题 小于 n 的最大整数 贪心 回溯

给定一个数字字符串S和一个数组nums,数组中的元素都在0~9之间,问从数组中选择元素组成的数字,小于N的最大值是多少?
例如:S = “24378”,nums:{2,3,9},组成的最大值为23999。

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        /*
        示例 1:A={1, 2, 9, 4},n=2533,返回 2499。

        示例 2:A={1, 2, 5, 4},n=2543,返回 2542。

        示例 3:A={1, 2, 5, 4},n=2541,返回 2525。

        示例 4:A={1, 2, 9, 4},n=2111,返回 1999。

        示例 5:A={5, 9},n=5555,返回 999。
         */

        // 示例1
        int[] a1 = {1, 2, 9, 4};
        int[] n1 = {2, 5, 3, 3};
        System.out.println("示例1:" + getMaxLessNum(a1, n1) + " (应返回2499)");

        // 示例2
        int[] a2 = {1, 2, 5, 4};
        int[] n2 = {2, 5, 4, 3};
        System.out.println("示例2:" + getMaxLessNum(a2, n2) + " (应返回2542)");

        // 示例3
        int[] a3 = {1, 2, 5, 4};
        int[] n3 = {2, 5, 4, 1};
        System.out.println("示例3:" + getMaxLessNum(a3, n3) + " (应返回2525)");

        // 示例4
        int[] a4 = {1, 2, 9, 4};
        int[] n4 = {2, 1, 1, 1};
        System.out.println("示例4:" + getMaxLessNum(a4, n4) + " (应返回1999)");

        // 示例5
        int[] a5 = {5, 9};
        int[] n5 = {5, 5, 5, 5};
        System.out.println("示例5:" + getMaxLessNum(a5, n5) + " (应返回999)");
    }

    /**
     * 获取由数组nums中的元素组成的数字,且小于n的最大值
     * @param nums 数组中的元素都在0~9之间
     * @param n 目标数字数组
     * @return 由nums中的元素组成的数字,且小于n的最大值
     */
    public static String getMaxLessNum(int[] nums, int[] n) {
        // 对nums数组进行排序,方便后续查找最大值
        Arrays.sort(nums);

        // 用于存储结果数字的字符串
        StringBuilder s = new StringBuilder();
        // 深度优先搜索,寻找最大值
        dfs(true, s, nums, n, 0);

        return s.toString();
    }

    /**
     * 深度优先搜索,寻找最大值
     * @param equal 当前位是否与目标数字相等
     * @param s 用于存储结果数字的字符串
     * @param nums 数组中的元素都在0~9之间
     * @param n 目标数字数组
     * @param index 当前处理的位索引
     * @return 是否找到符合条件的数字
     */
    private static boolean dfs(boolean equal, StringBuilder s, int[] nums, int[] n, int index) {
        // 如果是最后一位,则需要判定是否有小于n的数
        if (index == n.length - 1) {
            if (!equal) {
                // 如果前面已经有不相等的位,则直接取nums的最大值
                s.append(nums[nums.length - 1]);
                return true;
            } else {
                // 否则需要寻找小于n最后一位的最大值
                for (int i = nums.length - 1; i >= 0; i--) {
                    if (nums[i] < n[n.length - 1]) {
                        s.append(nums[i]);
                        return true;
                    }
                }
                return false;
            }
        }

        // 前面有不相等的,后面都取nums的最大值即可
        if (!equal) {
            for (int i = index; i < n.length; i++) {
                s.append(nums[nums.length - 1]);
            }
            return true;
        }

        // 前面都相等,优先取和n[index]相同的值,深度优先遍历,如果后面组成的数小于n,则找到了最大的值。如果当前值小于n[index],则后面都取nums的最大值即可
        for (int i = nums.length - 1; i >= 0; i--) {
            if (nums[i] == n[index]) {
                s.append(nums[i]);
                boolean result = dfs(true, s, nums, n, index + 1);
                if (result) {
                    return true;
                } else {
                    s.deleteCharAt(s.length() - 1); // 回溯,删除最后一个字符
                }
            }

            if (nums[i] < n[index]) {
                s.append(nums[i]);
                dfs(false, s, nums, n, index + 1); // 后续位都取最大值
                return true;
            }
        }

        // 如果前面都不满足,删除第一位即可
        if (index == 0) {
            dfs(false, s, nums, n, index + 1);
            return true;
        }

        return false;
    }
}

👨‍🏫 参考博客

相关文章:

  • vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag
  • 2025年上半年NPDP报名已开启,附报名流程!
  • 家庭 企业数据仓库:如何配置和管理 NAS 系统
  • @AuthenticationPrincipal user null
  • 当全球化成为商业常态,Shopify 如何为品牌生意铺平出海之路?
  • Windows10安装cuda10.2以及cudnn v7.6.5教程
  • Flink CDC 与 SeaTunnel CDC 简单对比
  • Blender配置渲染设置并输出动画
  • 【Linux 维测专栏 5 -- linux pstore 使用介绍】
  • 【AI论文】DeepMesh:基于强化学习的自回归艺术家网格创建
  • 3月21号
  • HeyGem.ai 全离线数字人生成引擎加入 GitCode:开启本地化 AIGC 创作新时代
  • 音频焦点 Android Audio Focus
  • Qemu-STM32(十):STM32F103开篇
  • 发现一个好用的Vue.js内置组件
  • Linux与HTTP报头属性和请求方式
  • 科普几种msvcp140.dll丢失的解决方法,msvcp140.dll找不到是怎么回事
  • 数据库原理及应用mysql版陈业斌实验一
  • 数据清理工具——OpenRefine的进阶操作
  • 验证码设计与前端安全:实现方式、挑战与未来发展趋势深度分析
  • 60余年产业积累,“江苏绿心”金湖炼就“超级石油工具箱”
  • 上海浦东机场1号、2号航站楼均推出国内出发安检24小时服务
  • 人民日报整版聚焦:专家学者看2025中国经济增长点
  • 外交部就习近平主席将出席中拉论坛第四届部长级会议开幕式介绍情况
  • 郎朗也来了,在辰山植物园“轻松听古典”
  • 巴基斯坦对印度发起网络攻击,致其约70%电网瘫痪