题目:
假设正整数n、s、s<n。 设计算法队任一给定n位数,删除其中的s位后, 使用剩下的位组成的新数最小
思路:
类似冒泡排序方法,循环s次,从高位开始两两冒泡;高位数比第位数大就删除,否则继续下连续的两个数据比较;以此类推,直到s–<=0。
举例:
n=263548 , s=3
s=3 第一次循环
2 6 3 5 4 8
⬆ ⬆
2<=6 true 继续循环
2 6 3 5 4 8
⬆ ⬆
6<=3 false 删除6后,再从头开始比较
s=2 第二次循环
2 3 5 4 8
⬆ ⬆
2<=3 true
2 3 5 4 8
⬆ ⬆
3<=5 true
2 3 5 4 8
⬆ ⬆
5<=4 false 删除5后,再从头开始比较
s=1 第三次循环
2 3 4 8
⬆ ⬆
2<=3 true
2 3 4 8
⬆ ⬆
3<=4 true
2 3 4 8
⬆ ⬆
4<=8 false 删除8后,s为0,循环结束
余下的结果为:234
代码实现:
public class demo {
public static void main(String[] args) {
int num = getNewMinNum(263548, 3);
System.out.println(num);
}
// 删除s位,因此大循环s次,每一次从头开始,两数比对,只要前一位比后一位大就结束循环,删除大数
private static int getNewMinNum(int n, int s) {
// StringBuffer类比String类更适合增删,因此选用StringBuffer类。
StringBuffer snBuffer = new StringBuffer(n + "");
// snBuffer.append(String.valueOf(n).toCharArray());
int i; // 记录比较位,每次从最高位进行比较,因此下面需要赋初值0
while (s-- > 0) {
i = 0;
while (i < snBuffer.length() - 1 && snBuffer.charAt(i) <= snBuffer.charAt(i + 1)) {
i++;
}
snBuffer.deleteCharAt(i);
}
return Integer.parseInt(snBuffer.toString());
}
}
}