一、题目描述
给一个正整数num1,计算出新正整数num2,num2为num1中移除N位数字后的结果,需要使得num2的值最小。
二、输入描述
输入的第一行为一个字符串,字符串由0~9字符组成,记录正整数num1,num1的长度小于32。
输入的第二行为需要移除的数字的个数,小于num1的长度。
三、输出描述
输出一个数字字符串,记录最小值num2。
例如:
2681372
4
输出132
四、解题思路
输入:
61811354 共8位 定义变量sum
4 移除的个数4 定义变量removeSum
输出4位 剩余的个数4 定义变量returnSum
输出:
1113
思路
- 计算出输出数字的位数sum;
- 从开头遍历到sum - returnSum,找到最小的数(获取第一位时,此时sum - returnSum为4,也就是遍历到下角标为4的数字,即从61811中找出最小值1);
- 再从当前位置遍历到sum - (returnSum-1),找到最小的数(获取第二位时,此时sum - (returnSum-1)为5,也就是从第一个数字1的下一个数字开始遍历,遍历到下角标为5的数字,即从8113中找出最小值1);
- 再从当前位置遍历到sum - (returnSum-2),找到最小的数(获取第三位时,此时sum - (returnSum-2)为6,也就是从第二个数字1的下一个数字开始遍历,遍历到下角标为5的数字,即从135中找出最小值1);
- 再从当前位置遍历到sum - (returnSum-3),找到最小的数(获取第三位时,此时sum - (returnSum-3)为7,也就是从第三个数字1的下一个数字开始遍历,遍历到下角标为7的数字,即从354中找出最小值3);
- 此时已经找到了4个数字,即1113。
我相信,屏幕前,聪明的你,已经找到了思路。
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String num1 = sc.nextLine();
int removeSum = Integer.valueOf(sc.nextLine());
// 数字num1的长度
int sum = num1.length();
// 剩余字符串的长度
int returnSum = num1.length() - removeSum;
// 当前下角标
int currentIndex = 0;
// 返回的最小数字
String ret = "";
// 寻找第几位数字
int index = 1;
while (ret.length() < returnSum){
// 求当前位的最小值
int min = Integer.MAX_VALUE;
// 获取第index位的最小数
for (int i = currentIndex; i < sum - (returnSum - index); i++) {
// char转int
int temp = num1.charAt(i) - '0';
min = Integer.min(min, temp);
}
// 获取第index位的最小数的下角标
for (int i = currentIndex; i < sum - (returnSum - index); i++) {
if(num1.charAt(i) - '0' == min){
currentIndex = i;
break;
}
}
ret = ret + "" + min;
// 下一次从当前位的下一位开始遍历
currentIndex++;
// 开始遍历下一位
index++;
}
System.out.println(ret);
}
六、效果展示
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。