zoukankan      html  css  js  c++  java
  • LeetCode 402. Remove K Digits

    402. Remove K Digits

    Description Submission Solutions Add to List

    • Total Accepted: 13739
    • Total Submissions: 52825
    • Difficulty: Medium
    • Contributors: Admin

    Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.

    Note:

    • The length of num is less than 10002 and will be ≥ k.
    • The given num does not contain any leading zero.

    Example 1:

    Input: num = "1432219", k = 3
    Output: "1219"
    Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.

    Example 2:

    Input: num = "10200", k = 1
    Output: "200"
    Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.

    Example 3:

    Input: num = "10", k = 2
    Output: "0"
    Explanation: Remove all the digits from the number and it is left with nothing which is 0.

    Subscribe to see which companies asked this question.

    【题目分析】

    即使知道一个题目的解题思路,如何用代码简洁优美地来表达也是一种艺术。

    这个题目的大意是去掉一个数中出现的若干数字,使得得到的数是可能得到的结果中最小的那个。

    【思路分析】

    通过观察不难发现,我们每次都去掉那个从头开始搜索的局部最大值,采用这种贪心策略可以得到最优解。在得到结果后我们还要对开始字符为0的特殊情况进行处理。但是在实现的时候,自己的代码不仅冗余,而且对边界情况处理很不到位,导致最后的结果不正确。看了讨论区大神的代码,真是很惭愧。

    【java代码】

     1 public class Solution {
     2     public String removeKdigits(String num, int k) {
     3         int digits = num.length() - k;
     4         char[] stk = new char[num.length()];
     5         int top = 0;
     6         // k keeps track of how many characters we can remove
     7         // if the previous character in stk is larger than the current one
     8         // then removing it will get a smaller number
     9         // but we can only do so when k is larger than 0
    10         for (int i = 0; i < num.length(); ++i) {
    11             char c = num.charAt(i);
    12             while (top > 0 && stk[top-1] > c && k > 0) {
    13                 top -= 1;
    14                 k -= 1;
    15             }
    16             stk[top++] = c;
    17         }
    18         // find the index of first non-zero digit
    19         int idx = 0;
    20         while (idx < digits && stk[idx] == '0') idx++;
    21         return idx == digits? "0": new String(stk, idx, digits - idx);
    22     }
    23 }
  • 相关阅读:
    C#发送邮件简单例子
    ABAP随笔
    日期格式转换
    正则校验金额,整数8位,小数3位。
    angular语法运用技巧
    Oracle中连接与加号(+)的使用
    含有代码分析的面试题
    面试的java题目
    递归查询
    本地没有ORACLE远程登录oracle服务器
  • 原文地址:https://www.cnblogs.com/liujinhong/p/6411844.html
Copyright © 2011-2022 走看看