移掉 K 位数字(LeetCode 402)

文章目录

  • 1.问题描述
  • 2.难度等级
  • 3.热门指数
  • 4.解题思路
    • 4.1 暴力法
    • 4.2 贪心 + 单调栈
  • 参考文献

1.问题描述

给你一个以字符串表示的非负整数 num 和一个整数 k,移除这个数中的 k 位数字,使得剩下的整数最小。请你以字符串形式返回这个最小的整数。

示例 1 :

输入:num = "1432219", k = 3
输出:"1219"
解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。

示例 2 :

输入:num = "10200", k = 1
输出:"200"
解释:移掉首位的 1 剩下的数字为 200。注意输出不能有任何前导零。

示例 3:

输入:num = "10", k = 2
输出:"0"
解释:从原数字移除所有的数字,剩余为空就是 0 。

提示:

  • 1 <= k <= num.length <= 105
  • num 仅由若干位数字(0 - 9)组成
  • 除了 0 本身之外,num 不含任何前导零

2.难度等级

Medium。

3.热门指数

★★★★☆

出题公司:富途。

4.解题思路

4.1 暴力法

对于两个相同长度的数字序列,最左边不同的数字决定了这两个数字的大小,因为高位的数字位权比低位的大。

例如 A=1axxx,B=1bxxx,如果 a>b 则 A>B。

基于此,我们可以知道,若要使得剩下的数字最小,需要保证靠前的数字尽可能小。

所以每移除一个数字,从左遍历,找到第一个比右边大的数字,移除即可。

如果找不到,则移除最后一个数字即可。

循环上面的操作,直到移除 K 位数字。

在这里插入图片描述

我们以 4258 为例,如果要求我们删除两个数字。

第一次遍历,找到第一个大于右边的数字,为 4,所以删除 4 剩下 258。

第二次遍历,直到最后一个数字,也没有找到,所以删除最后一个数字 8 即可。

剩下 25 便是最小数。

这里需要注意,剩下的数不能有前导零。比如 108 删除一位数字,那么删除 1 后,最终返回前需要将前导 0 去掉。

时间复杂度:

每次遍历找到第一个大于右边的数字时间复杂度是 O(n),需要遍历 k 次,所以总的时间复杂度是 O(nk)。

空间复杂度: O(1)。

下面以 Go 给出实现示例。

func removeKdigits(num string, k int) string {// 遍历 k 次找到第一个大于右边相邻的数字并移除for i := 0; i < k; i++ {j := 0for ; j < len(num)-1; j++ {if num[j] > num[j+1] {break}}num = num[:j] + num[j+1:]}// 去除前导零num = strings.TrimLeft(num, "0")if num == "" {return "0"}return num
}

4.2 贪心 + 单调栈

其实,最小的数有一个特点,就是小的数字在高位(左边),大的数字在低位(右边),比如 123 小于 321。

所以最小的数的数字应该是单调不降的,删除的 k 位数字都尽可能的在高位(左边)寻找。

考虑从左往右增量的构造最后的答案,我们可以用一个栈维护当前的答案序列。

栈中的元素代表截止到当前位置,删除不超过 k 次个数字后,所能得到的最小整数。根据之前的讨论:「在删除 k 个数字之前,栈中的序列从栈底到栈顶单调不降」。

因此,对于每个数字,如果该数字小于栈顶元素,我们就不断地弹出栈顶元素,直到

  • 栈为空
  • 或者新的栈顶元素不大于当前数字
  • 或者我们已经删除了 k 位数字

然后入栈。

如果已经删除了 k 位数字,那么将栈中数字与剩余数字拼接,去掉前导零后返回。

如果还没有删除 k 位数字,则继续遍历后面的数字直到遍历完。

最后栈中的数字是「单调不降」,所以弹出剩余未删除的数字后,去掉前导零后返回即可。

在这里插入图片描述

时间复杂度: 遍历一次整数即可,所以时间复杂度是 O(n)。

空间复杂度:需要一个单调栈存储已经遍历的数字序列,所以空间复杂度是 O(n)。

下面以 Go 为例给出实现。

func removeKdigits(num string, k int) string {var stack []byte// 遍历数字for i := range num {// 出栈for k > 0 && len(stack) > 0 && stack[len(stack)-1] > num[i] {stack = stack[:len(stack)-1]k--}// 入栈stack = append(stack, num[i])}stack = stack[:len(stack)-k]// 去除前导零num = strings.TrimLeft(string(stack), "0")if num == "" {return "0"}return num
}

参考文献

402. 移掉 K 位数字 - LeetCode

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#微信小程序(布局、渲染层基础知识)

1.IDE&#xff1a;微信开发者工具 2.实验&#xff1a; 3.记录: &#xff08;1&#xff09;view&#xff08;类似于div&#xff09; &#xff08;2&#xff09;块级元素不占满一行且水平均分布局flex,justify(space-around) &#xff08;3&#xff09;滚动<scroll view sc…

go语言-k8s宿主信息采集运维脚本

背景 由于工作需要&#xff0c;需要采集k8s集群中的宿主相关信息&#xff0c;包括cpu,memory,lvm,标签等信息。通常作为SRE会主选shell或python脚本来实现。但最近我们团队主流开发语言已经切换到golang.所以本次尝试用go语言来写写运维脚本。 实现流程图 代码实现 package m…

每日OJ题_牛客CM24 最近公共祖先

目录 牛客CM24 最近公共祖先 解析代码 牛客CM24 最近公共祖先 最近公共祖先_牛客题霸_牛客网 解析代码 class LCA { public:int getLCA(int a, int b) {// 左孩 父 * 2 1&#xff0c;右孩 父 * 2 2&#xff1b;// 父 &#xff08;孩 - 1&#xff09; / 2&#xff1b;/…

妇女节特刊 | 上海交大吴梦玥:用言语智能技术,为精神疾病开出第一张诊疗单

从孩童的咿呀学语&#xff0c;到青年时期聊不完的少年心事&#xff0c;进而人到中年&#xff0c;耳边既有父母长辈的叮咛关切&#xff0c;也有生活压力一刻不停的催促……细细回想&#xff0c;人生每个阶段的经历与回忆都萦绕着不同的声音&#xff0c;夏日的蝉鸣与篮球场上的聒…

探索数据可视化:Matplotlib 基础指南

图形绘制 import numpy as np import pandas as pd import matplotlib.pyplot as pltx np.linspace(0,2 * np.pi,100)# 说明&#xff1a;正弦波。x&#xff1a;NumPy数组 # 所有的数据&#xff0c;进行正弦计算 y np.sin(x)plt.plot(x,y)# 指定x轴范围 plt.xlim(-1,10) # 指…

EXSI create datastore

文章目录 1. 简介2. 清空磁盘3. 删除表4. 创建database 1. 简介 在 ESXi 环境中创建数据存储(Datastore)的步骤如下: 登录 vSphere Web Client 打开 Web 浏览器,输入 ESXi 主机或 vCenter Server 的 IP 地址,使用有权限的账户登录。 在 ESXi 环境中创建数据存储(Datastore)…

使用 Docker 部署 File Browser 文件管理系统

1&#xff09;File Browser 介绍 官网&#xff1a;https://filebrowser.org/ GitHub&#xff1a;https://github.com/filebrowser/filebrowser 今天为大家分享一款开源的私有云盘项目&#xff1a;File Browser&#xff0c;简单实用、轻量级、跨平台&#xff0c;安装部署简单快…

图文并茂的讲清楚Linux零拷贝技术

今天我们来聊一聊Linux零拷贝技术&#xff0c;今天我们以一个比较有代表性的技术sendfile系统调用为切入点&#xff0c;详细介绍一下零拷贝技术的原理。 1.零拷贝技术简介 Linux零拷贝技术是一种优化数据传输的技术&#xff0c;它可以减少数据在内核态和用户态之间的拷贝次数&…

基于java SSM校园兼职平台系统设计和实现

基于java SSM校园兼职平台系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方…

RabbitMQ的Windows版安装教程

文章目录 前言一、Windows安装RabbitMQ总结 前言 曾经写过一篇关于RabbitMQ的Ubuntu安装教程&#xff08;http://t.csdnimg.cn/5CYfC&#xff09;&#xff0c;当时使用的是Docker将RabbitMQ安装到虚拟机上&#xff0c;但是有很多小伙伴问Windows上如何进行安装RabbitMQ&#x…

神经网络softmax算法与卷积层

多类分类&#xff1a; 多类是分类算法中的一种&#xff0c;它区别于我们的0&#xff0c;1这样子的二进制分类&#xff0c;它会有多个分类的标签&#xff0c;让我们去取其中的一个。 softmax函数&#xff1a; softmax回归算法是我们的sigmoid回归的推广。 上图就是softmax运…

java项目线上捉BUG经验记录

一 线上问题 昨晚上突然接到公司紧急来电电桩设备大面积离线&#xff0c;意味着某市的车无法充电……”&#xff0c;细想这个平台很久都没有更新&#xff0c;最近出现问题是刚好在一个月前也是出现这种情况&#xff0c;再上一次就是几年前更新的。平台平时是稳定&#xff0c;开…