题目:给定一个整形数组,去掉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;
}
网友评论