当前位置:网站首页>LeetCode-402-移掉K位数字
LeetCode-402-移掉K位数字
2022-08-10 20:54:00 【z754916067】
题目

思路
- 感觉给数字排序没有用,应该使用回溯进行循环比较。
- 写了一个回溯,超出时间限制了…回溯确实时间复杂度也高,记录一下,润去题解
//target为目标删除多少数字 now为当前删除多少数字 char为上次删除字符 为了进行回溯
public void Back(StringBuilder nownum,int target,int now){
if(target==now){
//比较两个字符串的大小 不能直接转 长度会超过
//赋给ans
ans = Compare(nownum.toString(),ans);
return;
}//否则开始减
for(int i=0;i<nownum.length();i++) {
StringBuilder sb = new StringBuilder(nownum);
Back(sb.deleteCharAt(i), target, now + 1);
}
}
- 对字符串进行从左至右的遍历,对每一个遍历到的元素,看是否需要选择性丢弃之前的前面相邻的元素,因为对于aabbce来说,就可以判断aabbc好,还是aabbe好
- 需要注意的是,如果碰见一个单调递增的数字,那么会永远选择不丢弃,但题意要求必须丢弃k个,为了解决这个问题,每次丢弃的时候要需要让k减去1,即完成一次丢弃,减到0的时候可以终止遍历,因为已经丢够k次了。
- 但也有可能,遍历结束后k还没有减到0,此时可以保留n-k的数字的意思,所以遍历后选取前n-k个即可。
代码
public String removeKdigits(String num, int k) {
int remain = num.length()-k;
//创建stack用来接收
Stack<Character> cs = new Stack<>();
for(int i=0;i<num.length();i++){
//弹出栈顶 与其比较将哪个放入栈中
while(k!=0 && !cs.isEmpty() && cs.peek()>num.charAt(i)){
cs.pop();
k-=1;
}
cs.push(num.charAt(i));
}
//取前n-k个
StringBuilder ans = new StringBuilder();
while(!cs.isEmpty()) ans.append(cs.pop());
String ans1 = ans.reverse().substring(0,remain);
//删除前导0
int nums=0;
for(int i=0;i<ans1.length();i++){
if(ans1.charAt(i)=='0') nums++;
else break;
}
if(nums==ans1.length()) return "0";
else return ans1.substring(nums);
}
边栏推荐
猜你喜欢
随机推荐
这些mysql基础命令、基础知识还记得吗?(面试,学习,复习都可以)一万三千字总结
二级指针的简单理解
ArcMap创建镶嵌数据集、导入栅格图像并修改像元数值显示范围
[Golang]用反射让你的代码变优美
QSslSocket has not been declared
The use of TortoiseSVN little turtle
Kerberos认证
C. Social Distance
详叙c中的分支与循环
Introduction to PostgreSQL
第五届“强网杯”全国网络安全挑战赛(线上赛)
什么是抽象类?什么时候用?什么是接口?抽象类与接口的区别?
HGAME 2022 Week2 writeup by pankas
2021DozerCTF
【nvm】【node多版本管理工具】使用说明和踩坑(exit status 1)
着力提升制造业核心竞争力,仪器仪表产业迎高质量发展
DDL:CREATE 创建数据库——《mysql 从入门到内卷再到入土》
Kubernetes 笔记 / 入门 / 生产环境 / 用部署工具安装 Kubernetes / 用 kubeadm 启动集群 / 用 kubeadm 创建集群
基于Pix4Dmapper的运动结构恢复法无人机影像三维模型重建
DDL:视图——《mysql 从入门到内卷再到入土》








