洛谷P1106 Java解法

题目出处点这里
在这里插入图片描述

思路见代码:

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));
	}
}

猜你喜欢

转载自blog.csdn.net/TXXERIN/article/details/107349885