给定一个整形数组,去掉k位后剩余数字按序组成数字最小

2018-09-19  本文已影响0人  Rannver

题目:给定一个整形数组,去掉k位后剩余数字按序组成数字最小
例如:3,1,2去掉1位,则有可能的结果是
去掉3,剩余12
去掉1,剩余32
去掉2,剩余31
结果最小数字是12

去掉k位之后的数字是最小的,首先要保证去掉k位之后的首位,是去掉k位之后所有结果里最小的。那么可以理解为,每次去掉1位之后,所组成的数字是所有结果里最小的,循环k次。可以用栈实现这一操作,每次遍历数组里的元素,如果有在此之间比它大的就出栈,直到栈为空或者已抽完k位。

代码如下:(Java语言实现)

private static int Calculate(int[] a,int k){

    Stack<Integer> stack = new Stack<>();
    boolean isZeroK = false;

    for (int i = 0;i<a.length;i++){
        if (stack.isEmpty()||isZeroK){
           //如果stack为空或者已经抽取完k位数字,直接入栈
            stack.push(a[i]);
        }else {
            //栈非空且在a[i]之前有比a[i]大的数字时,出栈
            while( !stack.isEmpty() && k>0 && stack.peek()>a[i]){
                stack.pop();
                k--;
            }

            if (k==0){
                isZeroK = true;
            }
            stack.push(a[i]);
        }

    }
   
    //用栈内剩余数字组合成一个整数
    int count = 0;
    int result = 0;
    while(!stack.isEmpty()){
        if (count==0){
            result += stack.pop();
        }else {
            int i = 10;
            int temp = count;
            while (temp-1>0){
                i = i*10;
                temp--;
            }
            result += stack.pop()*i;
        }
        count++;
    }

    return result;

}
上一篇 下一篇

猜你喜欢

热点阅读