字节高频算法面试题:小于 n 的最大数

news2025/1/16 4:42:52

问题描述(感觉n的位数需要大于等于2,因为n的位数=1的话会有点问题,“且无重复”是指nums中存在重复,但是最后返回的小于n最大数是可以重复使用nums中的元素的):

在这里插入图片描述

思路:

先对nums倒序排序 + 暴力回溯 + 剪枝优化
在这里插入图片描述

代码(含详细注释):

class Solution {
    public int ans = 0;
    public int getMaxNum(int[] nums, int n) { // 默认n的位数大于等于2
        // ① 降序排序
        Arrays.sort(nums);
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }

        // ② 试图寻找一个小于n的整数(位数和n一样)
        String nStr = String.valueOf(n);
        boolean isFound = dfs(nums, nStr, new ArrayList<>(), true);

        // ③ 比如这种情况,nums: 9 8 7, n: 123,nums中最小的数都比n要大,那么isFound是false
        if (!isFound) {
            for (int i = 0; i < nStr.length() - 1; i++) {
                ans = ans * 10 + nums[0]; // 比n少一位,然后由nums的最大元素组装而成
            }
        }
        return ans;
    }

    public boolean dfs(int[] nums, String nStr, List<Integer> path, boolean preIsEqual) {
        if (path.size() == nStr.length()) { // 递归出口。如果当前路径的数字已经达到整数n的位数了
            long pathSum = 0;
            for (int i = 0; i < path.size(); i++) {
                pathSum = pathSum * 10 + path.get(i);
            }
            // 如果 path: 444, n: 444 全部位置的数字相等也不行
            if (pathSum < Integer.parseInt(nStr)) {
                ans = (int) pathSum;
                return true; // 表示已经找到了
            }
            return false; // 有可能是, path: 444, n: 444,全部位置的数字相等也不行
        }

        for (int i = 0; i < nums.length; i++) {
            if (preIsEqual) { // 如果前面几位的数字,path对应的数和n对应位的数相等, 如: path:44_, n:444
                // 如果前面几位的数字,path对应的数和n对应位的数相等,且当前位数字nums[i]>n对应的位的数,那就剪枝
                if (nums[i] > nStr.charAt(path.size()) - '0') continue;
                // 否则可以加入路径
                path.add(nums[i]);
                boolean curFlag = dfs(nums, nStr, path, nums[i] == nStr.charAt(path.size()-1) - '0');
                if (curFlag) return true; // 找到了,直接返回
                path.remove(path.size() - 1);
            } else { // 如果前面几位的数字,path对应的数和n对应位的数完全不相等或者不都相等, 如: path:44_, n:543
                path.add(nums[i]);
                // 如果前面几位的数字,path对应的数和n对应位的数完全不相等或者不都相等, 那么后面的递归都将是不相等的
                boolean curFlag = dfs(nums, nStr, path, false);
                if (curFlag) return true; // 找到了,直接返回
                path.remove(path.size() - 1);
            }
        }
        return false; // 没找到
    }
}

测试

测试类

class SolutionTest {
    public static void test(int[] nums, int n, int expected) {
        Solution solution = new Solution();
        int result = solution.getMaxNum(nums, n);
        if (result != expected) {
            System.out.println("测试失败!");
            System.out.println("输入数组: " + arrayToString(nums));
            System.out.println("目标数: " + n);
            System.out.println("期望结果: " + expected);
            System.out.println("实际结果: " + result);
            System.out.println("------------------------");
        } else {
            System.out.println("测试通过: " + arrayToString(nums) + " -> " + n + " = " + result);
        }
    }

    private static String arrayToString(int[] arr) {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
            if (i < arr.length - 1) {
                sb.append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }

    public static void main(String[] args) {
        // 基本测试
        test(new int[]{1, 2, 9, 8}, 100, 99);
        test(new int[]{4, 5}, 445, 444);
        test(new int[]{4, 5}, 45, 44);

        // 边界情况
        test(new int[]{1, 9}, 10, 9);
        test(new int[]{9, 8}, 9, 8);
        test(new int[]{9}, 100, 99);

        // 所有数字都大于目标数
        test(new int[]{9, 8, 7}, 123, 99);
        test(new int[]{9, 8, 7}, 12, 9);

        // 复杂数字组合
        test(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9}, 3000, 2999);
        test(new int[]{1, 2, 8, 9}, 2990, 2989);

        // 相同数字
        test(new int[]{4}, 445, 444);
        test(new int[]{4}, 45, 44);
        test(new int[]{4}, 4445, 4444);

        // 大数测试
        test(new int[]{9}, 100000, 99999);
        test(new int[]{8, 9}, 99000, 98999);

        // 特殊数字组合
        test(new int[]{1, 2, 3}, 300, 233);
        test(new int[]{2, 8}, 290, 288);
        test(new int[]{2, 8, 9}, 289, 288);

        // 多位数测试
        test(new int[]{6, 7, 8, 9}, 9877, 9876);
        test(new int[]{6, 7, 8, 9}, 9868, 9867);

        // 相邻数字
        test(new int[]{8, 9}, 1000, 999);
        test(new int[]{8, 9}, 999, 998);

        // 混合数字
        test(new int[]{5, 9}, 6000, 5999);
        test(new int[]{5, 8, 9}, 5990, 5989);
        test(new int[]{5, 8, 9}, 5900, 5899);

        // 包含零
        test(new int[]{0, 9}, 100, 99);
        test(new int[]{0, 9}, 1000, 999);

        // 特殊序列
        test(new int[]{1, 2, 3, 4, 5, 6}, 54322, 54321);
        test(new int[]{0, 2, 3, 4, 5, 6}, 54321, 54320);

        // 重复数字
        test(new int[]{6, 6, 6, 6}, 6667, 6666);
        test(new int[]{5, 6}, 6666, 6665);

        // 极限情况
        test(new int[]{9}, 1000000, 999999);
        test(new int[]{9}, 100000, 99999);

        // 连续数字
        test(new int[]{1, 2, 3, 4, 5}, 12346, 12345);
        test(new int[]{1, 2, 3, 4}, 12345, 12344);
    }
}

结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相机动态/在线标定

图1 图2 基本原理 【原理1】平行线在射影变换后会交于一点。如图所示,A为相机光心,蓝色矩形框为归一化平面,O为平面中心。地面四条黄色直线为平行且等距的车道线。HI交其中两条车道线于H、I, 过G作HI的平行线GM交车道线于M。HI、GM在归一化平面上的投影分别为JK、PN,二者会…

在 Windows 11 WSL (Ubuntu 24.04.1 LTS) | Python 3.12.x 下部署密码学库 charm

1. 在 Windows 11 上部署 Ubuntu (WSL) 由于作者没有高性能的 Ubuntu 服务器或个人电脑&#xff0c;且公司或学校提供的 Ubuntu 服务器虽然提供高性能 GPU 等硬件配置但通常不会提供 root 权限&#xff0c;因而作者通过在搭载了 Windows 11 的个人电脑上启动 Ubuntu (WSL) 来进…

【中间件开发】Redis基础命令详解及概念介绍

文章目录 前言一、Redis相关命令详解及原理1.1 string、set、zset、list、hash1.1.1 string1.1.2 list1.1.3 hash1.1.4 set1.1.5 zset 1.2 分布式锁的实现1.3 lua脚本解决ACID原子性1.4 Redis事务的ACID性质分析 二、Redis协议与异步方式2.1 Redis协议解析2.1.1 redis pipeline…

设计模式的艺术读书笔记

设计模式的艺术 面向对象设计原则概述单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 创建的艺术创建型模式单例模式饿汉式单例与懒汉式单例的讨论通过静态内部类实现的更好办法 简单工厂模式工厂方法模式重载的工厂方法工厂方法的隐藏工厂方…

计算机毕设-基于springboot的甜品店管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

Mac 录制电脑系统内的声音的具体方法?

1.第一步&#xff1a;下载BlackHole 软件 方式1&#xff1a;BlackHole官方下载地址 方式2&#xff1a; 百度云下载 提取码: n5dp 2.第二步&#xff1a;安装BlackHole 双击下载好的BlackHole安装包&#xff0c;安装默认提示安装。 3.第三步&#xff1a;在应用程序中找到音频…

【开源免费】基于Vue和SpringBoot的课程答疑系统(附论文)

博主说明&#xff1a;本文项目编号 T 070 &#xff0c;文末自助获取源码 \color{red}{T070&#xff0c;文末自助获取源码} T070&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

ACM latex模板中的CCSXML (即:CCS Concept)怎么填?

CCS Concept 感谢CCS Concept 怎么填 的珠玉在前. 问题描述 如下&#xff0c;ACM模板&#xff08;比如ACM computing surveys&#xff09;有一段是需要填写 ccsxml&#xff1a; %% %% The code below is generated by the tool at [http://dl.acm.org/ccs.cfm.](http://dl.…

【Transformer序列预测】Pytorch中构建Transformer对序列进行预测源代码

Python&#xff0c;Pytorch中构建Transformer进行序列预测源程序。包含所有的源代码和数据&#xff0c;程序能够一键运行。此程序是完整的Transformer&#xff0c;即使用了Encoder、Decoder和Embedding所有模块。源程序是用jupyterLab所写&#xff0c;建议分块运行。也整理了.p…

Mybatis-plus 简单使用,mybatis-plus 分页模糊查询报500 的错

一、mybtis-plus配置下载 MyBatis-Plus 是一个 Mybatis 增强版工具&#xff0c;在 MyBatis 上扩充了其他功能没有改变其基本功能&#xff0c;为了简化开发提交效率而存在。 具体的介绍请参见官方文档。 官网文档地址&#xff1a;mybatis-plus 添加mybatis-plus依赖 <depe…

前端项目使用gitlab-cicd+docker实现自动化部署

GitLab CI/CD 是一个强大的工具&#xff0c;可以实现项目的自动化部署流程&#xff0c;从代码提交到部署只需几个步骤。本文将带你配置 GitLab CI/CD 完成一个前端项目的自动化部署。 前言 为什么使用cicddocker&#xff1f; 目前我们公司开发环境使用的shell脚本部署&#…

设计模式:20、状态模式(状态对象)

目录 0、定义 1、状态模式的三种角色 2、状态模式的UML类图 3、示例代码 0、定义 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。 1、状态模式的三种角色 环境&#xff08;Context&#xff09;&#xff1a;环境是一个类&#xff0…

Unity3D学习FPS游戏(13)玩家血量控制

玩家血量控制 血条UI玩家Canvas下的Slider血量逻辑控制 子弹攻击掉血子弹发射者的区分玩家受伤逻辑子弹碰撞检测 效果 血条UI 和之前我们前面介绍的玩家武器弹夹UI的思路是一样的&#xff0c;跟详细的细节可以参考博客Unity3D装弹和弹夹UI显示。 玩家Canvas下的Slider 之前玩…

【开源免费】基于SpringBoot+Vue.JS高校学科竞赛平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 075 &#xff0c;文末自助获取源码 \color{red}{T075&#xff0c;文末自助获取源码} T075&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

学在西电录播课使用python下载,通过解析m3u8协议、多线程下载ts视频块以及ffmpeg合并

本文涵盖的内容仅供个人学习使用&#xff0c;如果侵犯学校权利&#xff0c;麻烦联系我删除。 初衷 研究生必修选逃&#xff0c; 期末复习怕漏过重点题目&#xff0c;但是看学在西电的录播回放课一卡一卡的&#xff0c;于是想在空余时间一个个下载下来&#xff0c;然后到时候就…

基于php+mysql的旅游网站——记忆旅行 旅游分享 攻略分享 设计与实现 源码 配置 文档

旅游网站 1.项目描述2. 概述3.项目功能4.界面展示5.源码获取 1.项目描述 摘 要 随着互联网的不断发展&#xff0c;计算机网络逐渐普及到人们的生活&#xff0c;为人们带来了便捷。互联网的趋势扩大&#xff0c;运用到家家户户中。各行各业都在考虑利用互联网将自己的信息推广…

2024.12.6——攻防世界php_rce

知识点&#xff1a;PHP框架 RCE远程命令执行 PHP常用框架&#xff1a;php常用的7大框架_php框架-CSDN博客 1.小型项目&#xff1a;CodeIngiter 2.中型项目&#xff1a;CakePHP、Zend Framework、Laravel、Thinkphp 3.大型重量级项目&#xff1a;Yii、Symfony、Laravel 使用…

autogen 人工输入模式

一、Allowing Human Feedback in Agents 允许代理中的人类反馈 发起聊天 (initiate_chat) 功能&#xff1a;用于启动对话过程。 参数&#xff1a;max_turns&#xff1a;限制对话的最大回合数。如果设置为3&#xff0c;意味着对话将在第三个回合后自动终止&#xff0c;除非提前…

网络渗透实验四(渗透课)

实验目的和要求实验目的&#xff1a;通过对目标靶机的渗透过程&#xff0c;了解CTF竞赛模式&#xff0c;理解CTF涵盖的知识范围&#xff0c;如MISC、PPC、WEB等&#xff0c;通过实践&#xff0c;加强团队协作能力&#xff0c;掌握初步CTF实战能力及信息收集能力。熟悉网络扫描、…

C++_关于异常处理throw-try-catch

文章目录 作用1. 无异常捕获2. 有异常捕获 作用 简单说&#xff0c;异常处理机制主要作用是让程序能够继续执行&#xff0c;或者以一种可控的方式终止&#xff0c;而非让程序因为错误直接崩溃 一个简单的动态数组类&#xff0c;来看看有异常捕获和无异常捕获的区别 1. 无异常…