LintCode182:删除数字

几天在吃饭的时候好哥们推荐了一道题:LintCode182:删除数字

去听完360的宣讲会,回来做了一下,一开始没什么头绪,在纸上画了两下忽然明白了,但是各种情况比较多,所以有很多小条件需要注意。

题目:

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

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

N <= 240, k <= N

代码有点繁琐:

思路就是“双指针+递增递减处理”,注意各种小条件

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(A == null) return "0";
        int len = A.length();
        if(len<=k) return "0";
        int start = 0;
        char[] arr = new char[len];
        for(int i=0;i<len;i++){
            arr[i] = A.charAt(i);
        }
        for(int i=len-k;i<len;i++){
            int tmp = start;
            start = findPos(arr,tmp,i);
        }
        StringBuilder sb = new StringBuilder();
        
        int index=0;
        for(index=start;index<arr.length;index++){
            if(arr[index] !='0' && arr[index]!='#'){
                break;
            }
        }
        for(int i=index;i<arr.length;i++){
            if(arr[i] != '#' ){
                sb.append(arr[i]);
            }
        }
        return sb.toString();
    }
   
    public int  findPos(char[] arr,int start,int end){
        int pre = start;
        boolean find = false;
        for(int i=start+1;i<=end;i++){
            if(arr[i]!='#'){
                int cur = arr[i]-'0';
                if(arr[pre]-'0'>cur){
                    find = true;
                    arr[pre] = '#';   
                    break;
                }else if(arr[pre]-'0'<cur){
                    pre = i;
                }
            }
        }
        if(find==true){
            for(int j = start;j<=end;j++){
                if(arr[j] != '#'){
                    start = j;
                    break;
                }
            }
        }else{
            arr[end] = '#';
        }
        return start;
    }
}

 

你可能感兴趣的:(LintCode182:删除数字)