m位非负整数N去掉X位数的剩下位数最小值
题设
给定一个用字符串表示的m位非负整数N,去掉其中的x位数以后,使得剩下的数字Y最小:
注意:m>=x
N不会包含前导零,即首位一定是非0数字
输入:
第一行:字符窗数字a
第二行:x
示例:
输入:
1432319
3
输出:
1219
题目分析:该题依旧属于递归回溯问题
问题分析
第一次我们选择的第一个数将其加入集合中,然后递归选择第2个,第3个…直到集合的size等于我们去掉X个数以后剩余K位数的K,此时我们需要对其进行判断:
(1)如果此时我们集合中K位数对应的值比之前的最小值要小的话,交换最小值,然后继续回溯遍历
(2)如果此时我们集合中K位数对应的值比之前的最小值要大的话,继续回溯遍历
图解
java代码
package com.bingym.algorithm.recursionproblems.minnum;
import java.util.ArrayList;
import java.util.List;
public class minNum {
static int minNum = Integer.MAX_VALUE;
public static void main(String[] args) {
String num = "1432319";
int[] numArr = new int[num.length()];
//将String中的数值装换成int数组{1,4,3,2,3,1,9};
for (int i = 0; i < num.length(); i++) {
numArr[i] = Integer.parseInt(num.substring(i,i + 1));
}
int n = numArr.length;
int x = 3;
int k = numArr.length - x;//表示剩下求最小值的位数
List<Integer> list = new ArrayList<>();
setNum(numArr,0,k,n,list);
System.out.println("最小值为:" + minNum);
}
private static void setNum(int[] numArr, int start,int k, int n, List<Integer> list) {
if (list.size() == k) {
int num = getNum(list,k);
if (num >= (int)Math.pow(10,k-1) && num < minNum) {
minNum = num;
return;
}
return;
}
for (int i = start; i < n; i++) {
list.add(numArr[i]);
setNum(numArr,i+1,k,n,list);
list.remove(list.size() - 1);
}
}
private static int getNum(List<Integer> list, int k) {
double num = 0;
double m = (double)k;
for (int i = 0; i < k; i++) {
num = num + list.get(i)*Math.pow(10,--m);
}
return (int)num;
}
}