一、题目描述
给一个正整数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转intint 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机考。专栏会持续更新,每天在线答疑。
本文链接:https://my.lmcjl.com/post/9342.html
展开阅读全文
4 评论