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

字典序排数

文章目录

    • 题目
    • 思路
    • Python代码
    • C代码
    • 复杂度

题目

给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。
你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。

示例 1:
输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]示例 2:
输入:n = 2
输出:[1,2]

思路

假设n=123,字典序应该是1,10,100,101,102,这里只做了两种操作,乘10和加1,那我们就要搞清楚以下两个问题:

  • 什么时候乘10
  • 什么时候加1

优先选择乘10(100的字典序小于11),直到乘10大于n为止;
如果当前值乘10会大于n,那我们就选择加1,加1需要考虑以下两个边界问题:

  • 加1之后大于n
  • 当前值的个位数是9

如果当前值加1之后大于n,如当前值为123,则要整除10之后进行加1;
如果当前值的个位数是9,如109加1之后变为110,而11的字典序小于110,则要整除10之后进行加1;

Python代码

class Solution:def lexicalOrder(self, n: int) -> List[int]:ans = [0] * nnum = 1for i in range(n):ans[i] = numif num * 10 <= n:num *= 10else:while num % 10 == 9 or num + 1 > n:num //= 10num += 1return ans

C代码

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* lexicalOrder(int n, int* returnSize) {int *ans = (int *)malloc(n * sizeof(int));memset(ans, 0, n * sizeof(int));int num = 1;for (int i = 0; i < n; i++) {ans[i] = num;if (num * 10 <= n) {num = num * 10;} else {while (num % 10 == 9 | num + 1 > n) {num = num / 10;}num++;}}*returnSize = n;return ans;
}

复杂度

  • 时间复杂度O(N)
  • 空间复杂度O(1)
http://www.xdnf.cn/news/933679.html

相关文章:

  • 标准解读;高校数据安全分类分级指南【附全文阅读】
  • 虚拟机时间同步
  • Python Web项目打包(Wheel)与服务器部署全流程
  • 前端知识导图
  • 嵌入式面试常问问题
  • Spring框架的设计模式
  • 31.1linux中Regmap的API实验(知识)_csdn
  • 【版本控制】Git 和 GitHub 入门教程
  • Flink CDC 中 StartupOptions 模式详解
  • LambdaqueryWrapper的介绍与使用
  • F(x,y)= 0 隐函数 微分法
  • STL详解——list的模拟实现
  • 【CSS-7】深入解析CSS伪类:从基础到高级应用
  • 【Linux】gcc、g++编译器
  • 香橙派3B学习笔记8:snap安装管理软件包_打包俩个有调用的python文件
  • 机器人/智能车纯视觉巡线经典策略—滑动窗口+直方图法
  • Unity3D 开发中的创新技术:解锁 3D 开发的新境界
  • SQL 注入开放与修复
  • NLP学习路线图(三十三): 文本分类
  • LiveCycle Designer 创建提交表单
  • FlexRay总线
  • web架构4------(nginx常用变量,nginx中英文自动匹配,lnmp网站架构,正向代理,反向代理,负载均衡)
  • GPU虚拟化
  • 【 SpringCloud | 微服务 MQ基础 】
  • 【AS32系列MCU调试教程】深度解析:使用 Eclipse 调试AS32系列MCU芯片的工程搭建
  • 永磁同步电机无速度算法--自适应龙贝格观测器
  • 技术栈Etcd的介绍和使用
  • RMQ 算法详解(区间最值问题)
  • 自然语言处理——文本分类
  • Unity使用代码分析Roslyn Analyzers