1 问题
琪琪喜欢旅游。有一天,她发现了一盏神灯,不幸的是,灯里的精灵不是那么善良。琪琪必须回答一个问题,然后精灵会实现她的一个梦想。问题是:给你一个整数,你需要删除 m 位数。剩下的的数字将形成一个新的整数,你要让这个整数最小。
不允许改变数字的顺序。现在你能帮助琪琪实现她的梦想吗?
2 抽象描述
给定两个正整数 x 和 m,要求从 x 中删除任意 m 位(不改变数字顺序),使得产生的正整数 r 最小。
3 解决方案
方案1
(1)思路
列出 x(位数为 n) 删除 m 位后的所有可能结果,从中找出最小值。
- 暂时假设 x 的前 n - m 位为最小值,记为 min
- 列举所有删除 x 的任意一位的结果,m 减小 1
- 对剩下的整数使用递归,重复 1 中操作
- 当 m 变为 0 时,判断当前整数是否小于 min,若是,则把 min 替换为当前整数。注意:由于整数第一位不能为 0,所以当前整数第一位为 0 时不进行替换。
(2) 实现
package lab.lab1.problem3;
public class MagicLamp1 {
private int min; //最小整数
public int findMin(int integer, int m) {
String str = String.valueOf(integer);
min = Integer.parseInt(str.substring(0, str.length() - m));
delete(String.valueOf(integer), m);
return min;
}
/**
* 从字符串中删除m位字符
*
* @param str 字符串
* @param m 要删除的字符位数
*/
private void delete(String str, int m) {
if (m == 0) { //已经删除m位
int temp = Integer.parseInt(str);
if (temp < min && str.charAt(0) != '0') { //首位不能是0
min = temp;
}
return;
}
for (int i = 0; i < str.length(); i++) { //删除字符串中任意一位
String s = str.subs