思路见代码:
package greedy;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
/**
* 目标:输出最小数
* 思路:
* 1、因为需要输出的是最小数,所以我们每次输出的时候尽量输出最小的那个数
* 2、比如字符串s:754381,k=4,需要按顺序输出两位数,按照排序后的数组arr{1,3,4,5,7,8}最小的是1,但是如果输出1则下一次没有数可以输出
* 3、因此我们选择第一个输出的是第二小的3,【当然记得把3以及之前的字符串从s中移掉,这样即可缩小下次查找的范围也就是81
* 4、当然原则上我们也应该把arr中相应的数据删掉,但实际上操作麻烦,而且不删掉只会出现arr中的值在s里找不到的情况(也就是index=-1),所以选择不删掉加个特判即可】
* 5、然后后重复以上步骤s.length-k次即可
* 6、最后注意可能有前几次输出都是0的情况,这时把字符串转为Integer输出即可
* @author XERIN
*
*/
public class P1106 {
static ArrayList<Integer> arr = new ArrayList<Integer>();//用来记录排序后的数据
static String res = "";//用来保存结果
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BigInteger bi = sc.nextBigInteger();
String s = String.valueOf(bi);
int k = sc.nextInt();
for (int i = 0; i < s.length(); i++) {
arr.add(Integer.parseInt(String.valueOf(s.charAt(i))));
}
Collections.sort(arr);// 对arr进行升序排列
int rest = arr.size() - k;//rest代表需要输出的数的长度
for (int i = 0; i < rest; i++) {// 要输出的数字长度,所有循环rest次,每一次输出一个即可
int index = 0;//存储需要输出的字符在s中的索引
for (int j = 0; j < arr.size(); j++) {//从排序好的arr中每次找可以找得到索引的最小值
index = s.indexOf(String.valueOf(arr.get(j)));// 找出最小值对应的index
//1、有可能找到了index但是index>k,就无法输出rest个结果了
//2、有可能在s中找不着,index=-1
if (index <= k && index != -1) {
res = res + String.valueOf(s.charAt(index));// 找着了就把它存起来
k = k - index;//因为每次都会移去s中的index个数,并输出一个数,所以k-index
break;//找着了就别再找了
}
}
//在每次找完后,记得把s中包括index在内的之前的字符串都移掉,缩小下此查找的范围
if (index != s.length() - 1) {
s = s.substring(index + 1);
}
}
//最后要考虑到前几次输出都为0的情况,把字符串变为Integer输出即可
System.out.println(Integer.parseInt(res));
}
}
版权声明:本文为TXXERIN原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。