链接:402. 移掉 K 位数字 - 力扣(LeetCode)
题目:
给你一个以字符串表示的非负整数
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
不含任何前导零
方法:
首先思考每次移除哪个元素。当是升序时,移除的是最后一个元素。是降序时,移除的是最前的元素。
我的思路是:
让arr栈第一个元素为num[0],arr[s]为栈顶元素,在arr[s]<=num[i],元素进栈。
在arr[s]>num[i],说明栈顶元素大于所遍历到的元素,出栈,并且i--,让下一个栈顶元素继续比较。
有思路后,就需要考虑边界问题和特殊情况。
我的代码还是比较啰嗦的,还可以优化。仅供参考。
代码:
/**
* @param {string} num
* @param {number} k
* @return {string}
*/
var removeKdigits = function(num, k) {
if(num.length == k) return '0'
let arr = [num[0]],s = 0
let i
//遍历num
for(i = 1;i < num.length ; i++){
if(k==0) {
if(!(arr.length==0&&num[i]==0))
arr.push(num[i]);
continue;
}
// console.log(arr,arr[s],num[i])
if(s==-1&&num[i]!=0){
arr.push(num[i]);
s++; continue;}
if(arr.length==0&&num[i]==0){
continue
}
if(arr[s]>num[i]){
arr.pop()
s--
i--
k--
}else{
arr.push(num[i])
s++
}
}
if(i==num.length){
arr.splice(s-k+1,k)
}
// console.log(arr,k)
return arr.join('')==''?'0':arr.join('')
};