力扣 - 剑指 Offer 17. 打印从1到最大的n位数
题目
思路1
- 如果有n位,那么最大值就是\(10^n-1\),即如果n是2,那么最大就到输出到99
- 考虑到大数情况,所以使用字符数组
- 还要把字符数组转化成数字
代码
class Solution {
int position = 0;
public int[] printNumbers(int n) {
int count = 0;
int[] res = new int[(int)Math.pow(10, n) - 1];
char[] chars = new char[n];
for (int i = 0; i < n; i++) {
chars[i] = '0';
}
while (!increment(chars)) {
convertNumber(chars, res);
}
return res;
}
public boolean increment(char[] chars) {
// 是否溢出
boolean isOverFlow = false;
// 记录进位
int takeOver = 0;
int length = chars.length;
for (int i = length-1; i >= 0; i--) {
// 记得加上进位的值
int sum = chars[i] - '0' + takeOver;
// 确保每次只increment只增加1
if (i == length-1) {
sum++;
}
if (sum >= 10) {
// 如果最高位的值还是大于等于10,说明溢出了
if (i == 0) {
isOverFlow = true;
break;
} else {
// 求余,记录进位,写回到数组中,然后进位继续加到下一位
sum -= 10;
takeOver = 1;
chars[i] = (char)('0' + sum);
}
} else {
// 如果没有溢出,直接写入到数组中去即可
chars[i] = (char)('0' + sum);
break;
}
}
return isOverFlow;
}
// 将字符数组转换成数字添加到结果集中
public void convertNumber(char[] chars, int[] output) {
// 用于判断的,不把0计入
boolean isBeginning = false;
int length = chars.length;
StringBuilder sb = new StringBuilder();
for (char c : chars) {
if (!isBeginning && c != '0') {
isBeginning = true;
}
if (isBeginning) {
sb.append(c);
}
}
output[position++] = Integer.parseInt(sb.toString());
}
}
复杂度分析
- 时间复杂度:\(O(10^N)\)
- 空间复杂度:\(O(N)\)
思路2
- n位的所有十进制数都是0~9的全排列
- 排列的时候,最后还要考虑前面的0要去掉
- 递归的结束条件就是我们已经排列到了第n位了
代码
class Solution {
int[] res;
int position = 0;
public int[] printNumbers(int n) {
res = new int[(int)Math.pow(10, n) - 1];
// 为了去掉无效的0,所以从第1位开始
for (int digit = 1; digit <= n; digit++) {
for (char first = '1'; first <= '9'; first++) {
char[] num = new char[digit];
num[0] = first;
dfs(1, digit, num);
}
}
return res;
}
public void dfs(int index, int length, char[] num) {
if (index == length) {
res[position++] = Integer.parseInt(String.valueOf(num));
return;
}
for (char i = '0'; i <= '9'; i++) {
num[index] = i;
dfs(index+1, length, num);
}
}
}
复杂度分析
- 时间复杂度:\(O(10^N)\)
- 空间复杂度:\(O(N)\)
力扣 - 剑指 Offer 17. 打印从1到最大的n位数的更多相关文章
- 剑指 Offer 17. 打印从1到最大的n位数
剑指 Offer 17. 打印从1到最大的n位数 Offer 17 题目解析: 暴力解法 package com.walegarrett.offer; /** * @Author WaleGarret ...
- [LeetCode]剑指 Offer 17. 打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7, ...
- 力扣 - 剑指 Offer 29. 顺时针打印矩阵
题目 剑指 Offer 29. 顺时针打印矩阵 思路1 其实就是按照理解题目的意思一步步从外层到内层打印出来,同时将一个外层分成四个部分分步打印 可以用一个变量count来维护当前打印的第几层 判断打 ...
- 力扣 - 剑指 Offer 06. 从尾到头打印链表.md
题目 剑指 Offer 06. 从尾到头打印链表 思路1(递归) 首先先遍历整个脸表,计算出链表的长度(用于初始化数组).然后进行递归,从链表头部递归到尾部,这期间什么都不做,直到递归到最后一个节点的 ...
- 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器
剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...
- 刷题-力扣-剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...
- 刷题-力扣-剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de ...
- 力扣 - 剑指 Offer 57. 和为s的两个数字
题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...
- 力扣 - 剑指 Offer 09. 用两个栈实现队列
目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 09. 用两个栈实现队列 思路 刚开始想的是用stack1作为数据存储的地方,stack2用来作为辅助栈,如果添加元素直接push入stac ...
随机推荐
- Mysql基本知识整理
一.简介 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 2.关系型数据库 ...
- 紫色飞猪的研发之旅--06go自定义状态码
在实际开发中,需要前后端需要协商状态码,状态码用于后端返前端时使用.在一个团队中,定义的状态码讲道理应该是一致的,项目开始的起始阶段状态码应该是定义了个七七八八的,随着功能的叠加而不断增加.此系列将围 ...
- Docker 学习目录
docker 概述 docker是什么 使用最广泛的肉开源容器引擎 其他如rocket,containerd,pouch等容器引擎 一种系统级虚拟化技术 传统的kvm xen,exsi,vmware ...
- 性能测试工具JMeter 基础(八)—— 测试元件: 逻辑控制器之事物控制器
事物控制器是将控制器下的所有取样器作为一个事物统计.分析 事物控制器(Transaction Controller) 事务控制器一共有两个选项: Generate parent sample:默认不勾 ...
- Python+mirai开发QQ机器人起步教程(2021.9.9测试有效)
参考:开发 mirai QQ机器人起步教程_叹之-CSDN博客_mirai python 本篇文章参考了以上博客,并对其中的失效内容和版本匹配问题进行了补充修改,实测能够成功运行.部分步骤的运行截图见 ...
- RabbitMQ-如何保证消息在99.99%的情况下不丢失
1. 简介 MQ虽然帮我们解决了很多问题,但是也带来了很多问题,其中最麻烦的就是,如何保证消息的可靠性传输. 我们在聊如何保证消息的可靠性传输之前,先考虑下哪些情况下会出现消息丢失的情况. 首先,上图 ...
- 从需求去理解 Linux dbus与基于dbus协议的无agent软件管理
What is IPC IPC [Inter-Process Communication] 进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法.在Linux/Unix中,提供了许多IPC ...
- 判断input radio选中那个
var _sex=$("input[name='sex']:checked").val(); if(_sex==null){ layer.msg("请选择性别" ...
- [第十一篇]——Docker 仓库管理之Spring Cloud直播商城 b2b2c电子商务技术总结
Docker 仓库管理 仓库(Repository)是集中存放镜像的地方.以下介绍一下 Docker Hub.当然不止 docker hub,只是远程的服务商不一样,操作都是一样的. Docker H ...
- JS HTML5仿微信朋友圈特效
完美! 图片相册翻页可定位在第几张,右上角可关闭. 源代码下载地址: 链接: https://pan.baidu.com/s/1o7PA7wu 密码: asyt