给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
我的解法:要使删除k位数字后剩余的数字最小,只需从左往右依次删除k个比后一个元素值大的当前元素。为了方便操作字符串,首先将String转为StringBuilder。在实际的算法中,可能存在num[i]均小于num[i+1]的情况,这时需要删除num[num.length() - 1],但依次删除k个比后一个元素值大的当前元素的方式无法考虑到num[num.length() - 1],因此从下标1开始考虑,查找num[i]<num[i-1]的最小下标,找到后删除当前下标的前一个元素。最后,若剩余字符串存在前导0,则将其删除。
时间复杂度:O(n2),空间复杂度:O(1)
class Solution {
public String removeKdigits(String num, int k) {
/*需要删除所有元素时,直接返回0*/
if (num.length() == k) {
return "0";
}
StringBuilder sb = new StringBuilder(num);
while (k > 0) {
int i = 1;
/*遍历当前sb,查找当前元素值小于前一个元素值的最小下标*/
while (i < sb.length() && sb.charAt(i) >= sb.charAt(i-1)) {
i++;
}
/*删除最小下标对应的前一个元素*/
sb.delete(i-1, i);
k--;
}
/*去除sb的前导0(排除当前sb为0的情况)*/
while (sb.length() > 1 && sb.charAt(0) == '0') {
sb.delete(0, 1);
}
return sb.toString();
}
}