diff --git a/README.md b/README.md index 4a8a757..fa1b252 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 2组:537 -3组:402 +3组:402 [402-移掉K位数字](details/402-移掉K位数字.md) 4组:114 diff --git "a/details/402-\347\247\273\346\216\211K\344\275\215\346\225\260\345\255\227.md" "b/details/402-\347\247\273\346\216\211K\344\275\215\346\225\260\345\255\227.md" new file mode 100644 index 0000000..1720aec --- /dev/null +++ "b/details/402-\347\247\273\346\216\211K\344\275\215\346\225\260\345\255\227.md" @@ -0,0 +1,60 @@ +### 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 + +注意: +num 的长度小于 10002 且 ≥ k。 +num 不会包含任何前导零。 + +示例 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。 + +### 题解: +从高位开始走,如果下一个数字比当前数字小,且要删除的数字次数没用完,则删除当前位置的数字,且继续向前比较,这样总能得到一个较小的序列。 +需要注意几个零界点:前边为0的数字和最后一位数字需要单独处理。 + +代码如下: + +```java +public static String removeKdigits(String num, int k) { + if(num == null || "".equals(num) || num.length() <= k) { + return "0"; + } + char[] array = new char[num.length()]; + array[0] = num.charAt(0); + int size = 1; + for (int i = 1; i < num.length(); i++) { + if(array[size-1] > num.charAt(i)){ + while (k > 0 && size > 0) { + if(array[size - 1] > num.charAt(i)) { + size--; + k--; + } else break; + } + } + array[size++] = num.charAt(i); + } + int begin = 0; + for (; begin < size; begin++) { + if(array[begin] != '0') + break; + } + String result = new String(array,begin,size-begin-k); + if(result.length() == 0) { + return "0"; + } + return result; + } +``` + +