题目:删除数字


给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。

找到删除 k 个数字之后的最小正整数。

N <= 240, k <= N

您在真实的面试中是否遇到过这个题?

Yes





样例

给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542, k = 4

返回一个字符串 "12"
标签 Expand   



相关题目 Expand

解题思路:
先用一个ArraryList将字符串的所有字符放入。
需要删除k个字符,每次去删除时删除这样一个元素,该元素满足:
找到第一个元素该元素的值大于下一个位置的元素。在这之前需要对List的切零处理。若没有找到这样一个元素,说明元素都是递增的,只需要删除最后一个元素即可。
比如A= 1078542  ,k=3
List={1,0,7,8,5,4,2} 找到第一个元素,满足 该元素的值大于下一个元素。既是1>0,去掉1。  
List={0,7,8,5,4,2},,此时再去寻找这么一个元素,找到是8>5,去掉8.
List ={0,7,5,4,2},先切零处理.List={0,7,5,4,2},此时再去寻找这么一个元素,找到是5>4,去掉4.
最终剩下了List={0,7,4,2}进行切0处理 返回742.
public class Solution {
    /**
     *@param A: A positive integer which has N digits, A is a string.
     *@param k: Remove k digits.
     *@return: A string
     */
    public String DeleteDigits(String A, int k) {
        // write your code here
          if (null == A || 0 == A.length())
               return "";
          ArrayList<Character> charList = new ArrayList<>();
          for (int i = 0; i < A.length(); i++) {
               charList.add(A.charAt(i));
          }
          for (int i = 0; i < k; i++) {
               delDig(charList);
          }
          String res = "";
          cutZero(charList);
          for (int i = 0; i < charList.size(); i++) {
               res += charList.get(i);
          }
          return res;
     }

     public void delDig(ArrayList<Character> charList) {
          // 每次找出第一个i,使得charList[i]>charList[i+1]删除,若没找到,删除最后一个元素
          int lastPos = charList.size() - 1;
          int maxPos = lastPos;
          for (int i = 0; i < charList.size() - 1; i++) {
               if (charList.get(i) > charList.get(i + 1)) {
                    maxPos = i;
                    charList.remove(i);
                    break;
               }
          }
          if (maxPos == lastPos) {
               charList.remove(charList.size() - 1);
          }
     }

     public void cutZero(ArrayList<Character> charList) {
          // 若最开始的的charList中有0,比如0000021,剔除0
          int k = charList.size() - 1;
          while (k-- > 0) {
               int i = 0;
               if (charList.get(i) == '0') {
                    charList.remove(i);
               } else {
                    break;
               }
          }
    }
}
感觉代码比较的繁琐和累赘,分析和上面一样。直接用一个tmp字符串去保存每次删除后的字符串,优化如下:
public class Solution {
    /**
     *@param A: A positive integer which has N digits, A is a string.
     *@param k: Remove k digits.
     *@return: A string
     */
    public String DeleteDigits(String A, int k) {
        // write your code here
         if(null==A||0==A.length()) return "";
         String tmp = A;
         while(k>0){
              int i=0;
              while(i<tmp.length()-1&&(tmp.charAt(i)<=tmp.charAt(i+1))){
                   i++;
              }
              tmp = tmp.substring(0,i)+tmp.substring(i+1,tmp.length());
              k--;
         }                 
         int i=0;
         while(i<tmp.length()-1&&tmp.charAt(i)=='0'){
              i++;
         }
         tmp = tmp.substring(i);
         return tmp;
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值