【LeetCode】剑指 Offer 17. 打印从1到最大的n位数 p114 -- Java Version

news2024/10/2 14:38:00

题目链接:https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/

1. 题目介绍(17. 打印从1到最大的n位数)

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

【测试用例】:

输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]

【条件约束】:

说明:

  • 用返回一个整数列表来代替打印
  • n 为正整数

2. 题解

2.1 普通循环 – O(10n)

时间复杂度O(10n),空间复杂度O(10n)

在这里插入图片描述

class Solution {
    // 方法1:不考虑数据溢出的情况(大数问题)
    public int[] printNumbers(int n) {
        // 1. 确定要打印的数字范围
        int num = 1;
        while (n > 0){
            num *= 10;
            n--;
        }
        // 2. 定义满足数字范围的数组
        int[] arr = new int[num-1];
        // 3. 循环遍历,将数字依次存入数组
        for (int i = 0; i < num-1; i++){
            arr[i] = i+1;
        }
        // 4. 返回数组
        return arr;
    }
}

在这里插入图片描述
可简化为:

class Solution {
    public int[] printNumbers(int n) {
        int end = (int)Math.pow(10, n) - 1;
        int[] res = new int[end];
        for(int i = 0; i < end; i++)
            res[i] = i + 1;
        return res;
    }
}

2.2 大数求解 – O(10n)

时间复杂度O(10n),空间复杂度O(10n)
在这里插入图片描述

  • 我们通过字符数组num来存储当前数字
  • 通过整型数组ans来存储应打印的所有数字
  • 在递归方法dfs中,一旦当前长度==输入值n时,就将其从字符数组转化成字符串。由于本题要求输出 int 类型数组,故为运行通过,还要将其再转化为 int 类型。
  • dfs中的for循环+递归,就是为了填充字符数组num。以输入值n=2为例,最后一个数字99,num[0]=‘9’,dfs(1) -> num[1] = ‘9’,n==2 条件满足,转化转化,最后存入数组。
class Solution {
    char[] num;
    int[] ans;
    int count = 0,n;
    public int[] printNumbers(int n) { // n = 2
        this.n = n;
        num = new char[n];
        ans = new int[(int) (Math.pow(10, n) - 1)];
        dfs(0);
        return ans;
    }
    private void dfs(int n) { // 0
        if (n == this.n) {
            // 将字符数组num转成字符串
            String tmp = String.valueOf(num);
            // 将字符串转成int
            int curNum = Integer.parseInt(tmp);
            // 存入数组
            if (curNum!=0) ans[count++] = curNum;
            return;
        }
        for (char i = '0'; i <= '9'; i++) {
            num[n] = i;
            dfs(n + 1);
        }
    }
}

在这里插入图片描述

3. 扩展

3.1 本题扩展

【本题扩展】:在前面的代码中,我们都是用一个char型字符表示十进制的数字的一位。8个bit的char型字符最多能表示256个字符,而十进制数字只有0~9的10个数字。因此用char型字符串表示十进制的数字并没有充分利用内存,有一些浪费,有没有更高效的方式来表示大数?
答案:位图(BitMap)

在一些数据量比较大的场景中,做一些查重、排序,一般的方法难以实现。数据量过大,会占用较大的内存,常用的处理方式有两种:BitMap(位图法)和布隆过滤

所谓BitMap就是用一个bit位来标记某个元素对应的value,而key即是这个元素。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间。

BitMap 优缺点:

  • 优点:实现简单。适合数据量比较大的场景。
  • 缺点:占用内存。申请的数组长度不好控制和最大的数值有关。当某个值特别大的情况下,映射的数组超过申请的数组容量,会出现下标越界。

3.2 相关题目

【相关题目】:定义一个函数。在该函数中可以实现任意两个整数的加法。由于没有限定输入两个数的大小范围,我们也要把它当做大数问题来处理,在前面的代码的第一个思路中,实现了在字符串表示的数字上加1的功能,我们可以参考这个思路实现两个数字的相加功能。另外还有一个需要注意的问题:如果输入的数字中有负数,我们应该怎么处理?

可参考:定义一个函数,在该函数中可以实现任意两个整数的加法。java实现

题解思想:
对于这道题,由于没有限定输入的两个数的范围,我们要按照大数问题来处理。由于题目是要求实现任意两个整数的加法,我们就要考虑如何实现大数的加法。此外这两个整数是任意的,所以也有可能存在负数。通常对于大数问题,常用的方法就是使用字符串来表示这个大数。我们可以首先将两个整数分别用字符串来表示,然后分别将这两个字符串拆分成对应的字符数组。当两个整数都是正数的时候直接相加结果为正数,同为负数的时候取两者的绝对值相加然后在结果前加一个负号。假若是一正一负,则用两者的绝对值相减,用绝对值大的数减去绝对值小的数,当正数的绝对值大的时候相减的结果为正数,当负数的绝对值大的时候相减的结果为负数,结果为负数时在相减的结果前加一个负号即可。在具体进行相加的时候两个字符数组对应的数字字符相加即可,当有进位的时候做出标记,在更高一位进行相加时再将这个进位加进去。同样在相减的时候有借位的也做出标记,在更高一位相减的时候将这个借位算进去。

4. 参考资料

[1] 面试题17. 打印从 1 到最大的 n 位数(分治算法 / 全排列,清晰图解)
[2] java基础–BitMap
[3] java中BitMap实现
[4] 第17题:打印1到最大的n位数
[5] 【转载】经典算法系列之(一) - BitMap

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

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

相关文章

<JVM上篇:内存与垃圾回收篇>12 - 垃圾回收相关概念

笔记来源&#xff1a;尚硅谷 JVM 全套教程&#xff0c;百万播放&#xff0c;全网巅峰&#xff08;宋红康详解 java 虚拟机&#xff09; 文章目录12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出&#xff08;OOM&#xff09;内存泄漏&#xff08;Memory Leak&#xff…

【Linux驱动开发100问】Linux驱动开发工程师在面试中常被问到的问题汇总

&#x1f947;今日学习目标&#xff1a;什么是Kconfig&#xff1f;如何使用Kconfig&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;Lin…

针对面试官的盘问-如何回答职场中的一些问题

(点击即可收听)初入职场,面对面试官的提问,如何回答01你为什么从上家公司离职?个人成长不足,不符合自己的预期&#xff08;关系到个人竞争力,希望找到一份更有挑战,个人提升更大的工作&#xff09;,切忌与面试官倒苦水,说前公司老板的不是业务发展缓慢,上升空间有限(有些不符合…

【华为OD机试模拟题】用 C++ 实现 - 不等式(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明不等式题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD …

正态分布、Q函数、误差函数erf()和互补误差函数erfc()

1、正态分布&#xff08;高斯分布&#xff09; 若随机变量 X服从一个位置参数为 μ、尺度参数为 σ 的概率分布&#xff0c;且其概率密度函数为 则这个随机变量就称为正态随机变量&#xff0c;正态随机变量服从的分布就称为正态分布&#xff0c;记作 X∼N(μ,σ2) 。 当μ0,σ…

【Opencv-python】之入门安装

目录 一、安装Python 1. 登录官网https://www.python.org/downloads/ 2. 任选一个版本&#xff0c;下载Python 3. 安装Python 记得勾选下图的Add Python 3.6 PATH, 添加python到环境变量的路径&#xff0c;然后选择Install now​编辑 4. 验证是否安装成功 5.退出 二、安装…

【华为OD机试模拟题】用 C++ 实现 - 路灯照明(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明路灯照明【华为OD机试模拟题】题目输入输出描述示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…

Redis源码---键值对中字符串的实现,用char*还是结构体

目录 前言 为什么 Redis 不用 char*&#xff1f; char* 的结构设计 操作函数复杂度 SDS 的设计思想 SDS 结构设计 SDS 操作效率 紧凑型字符串结构的编程技巧 小结 前言 对于 Redis 来说&#xff0c;键值对中的键是字符串&#xff0c;值有时也是字符串在 Redis 中写入一…

渗透之信息收集

信息收集 当我们需要渗透某一个网站、服务器。。。。时 我们首先得收集它得相关信息 比如: 域名、ip、端口、web cms指纹、目录扫描、网络空间测绘。。。。等等等等手段尽可能的去收集它的信息。 收集越多信息&#xff0c;相对于我们越有利&#xff0c;让我们有更多手段去对…

计算机组成原理(1)--计算机系统概论

一、计算机系统简介1.计算机系统软硬件概念计算机系统由“硬件”和“软件”两大部分组成。所谓“硬件”&#xff0c;是指计算机的实体部分&#xff0c;它由看得见摸得着的各种电子元器件&#xff0c;各类光、电、机设备的实物组成&#xff0c;如主机、外部设备等。所谓“软件”…

【华为OD机试模拟题】用 C++ 实现 - 某公司组织招聘(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明招聘 | 某公司组织题目输入输出示例一输入输出说明示例二输入输出说明示例三输入输出说明

C语言if判断语句的三种用法

C if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 语法 C 语言中 if 语句的语法&#xff1a; if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ }如果布尔表达式为 true&#xff0c;则 if 语句内的代码块将被执行。如果布尔表达式为 false&…

吉利「银河」负重突围

吉利控股集团最新公布的数据显示&#xff0c;2022年&#xff0c;吉利控股集团汽车总销量超230万辆&#xff0c;同比增长4.3%。其中&#xff0c;新能源汽车销量超64万辆&#xff0c;同比增长100.3%。 在中国本土市场&#xff0c;2022年吉利集团旗下品牌乘用车总交付量为135.84万…

scrcpy 无线投屏基本使用(强烈推荐)

目录scrcpy 的无线投屏控制&#xff1a;下载 scrcpy配置系统环境变量电脑连接设备adb多设备连接常用快捷键命令scrcpy 的无线投屏控制&#xff1a; 这个应用程序提供了 USB(或TCP/IP) 上连接的 Android 设备的显示和控制; 它是免费且开源投屏控制工具(模拟器)&#xff0c;它不需…

CUDA的下载安装

大家好,下面将进行CUDA的下载安装,下载安装的详细步骤描述如下: (1)CUDA下载 https://download.csdn.net/download/qq_41104871/87462747 (2)CUDA安装 1、首先,需要解压缩下载好的CUDA压缩包,CUDA压缩包如下图所示: 2、解压后,将会获得如下图所示的.exe文件: …

活动策划|深度分析年货节活动该如何策划!

四月初&#xff0c;不平凡的初春开始恢复往日的平静。对于新零售行业&#xff0c;疫情的缓解也逐渐平稳生态链的运转。2020年新零售的格局在洗礼后&#xff0c;业务的聚焦点也从前端促销转移到后端履约的体验闭环&#xff0c;同时很大程度的推进企业在危机公关下的应对。618大促…

STC32单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能和使用✨STC32单片机普通 I/O 口中断&#xff0c;不是传统外部中断. &#x1f516;手册上描述&#xff1a;STC32G 系列支持所有的 I/O 中断&#xff0c;且支持 4 种中断模式&#xff1a;下降沿中断、上升沿中断、低电平中断、高电平中断。每组 …

redis(11)事务秒杀案例

秒杀案例描述 现在有1个秒杀的功能&#xff0c;1个原来价值5000元的手机现在搞活动&#xff0c;降价到1块钱&#xff0c;做秒杀活动。库存就10个&#xff0c;假设有10000人抢购。 目前逻辑是&#xff1a;抢到了商品库存就减1&#xff0c;然后把用户id加入到秒杀成功者清单中 Re…

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——OutputFormat数据输出

3.6.1OutputFormat接口实现类 OutputFormat是MapReduce输出的基类&#xff0c;所有实现MapReduce输出都实现了OutputFormat接口。下面我们介绍几种常见的OutputFormat实现类。 1、文本输出TextOutputFormat 默认的输出格式是TextOutputFormat&#xff0c;它把每条记录写为文…

【Redis】应用一 : 分布式锁

一、分布式锁 本质就是实现一个线程在 Redis 中占坑&#xff0c; 用完了&#xff0c;再 del 释放坑 问题1&#xff1a; 程序出现异常&#xff0c; 导致 del 指令未被调用 解决1&#xff1a; 设置一个过期时间 问题2&#xff1a;expire 得不到执行&#xff0c;导致死锁 解决…