题目描述
思路分析
(1)要凑小于target的最大数,肯定是希望这个数和target位数相同最好,不行的话再减少一位数
(2)容易想到从target的最高位开始,从集合中找一个数,能等于它当然最好,不行的话就找小于它的最大那个。因此!就是要在数组nums中找最后一个小于等于target[0]的数(target[0]为最高位数字),这很明显的二分味道
(3)如果找到的数是等于它的,则继续找第二位;如果找到的数是小于它的,那后面位的数就不用找了,直接全都取nums中的最大值即可!注意,如果发现所有位都能找到相等的,那是不行的,也就是说最后一位不能取相等数,因此为了方便,本题可直接转换为找小于等于target-1的最大数!
(4)注意可能出现前面相等,后面某一位发现找不到符合条件的了,此时就要回到上一位重新取一个更小数,如果这一位也不行,则继续往前。如果所有位都不行,则最终结果就是比target少一位的,最大数组成的数
代码实现
1、贪心+二分(迭代法)
import java.util.*;
public class Main{
public static void main(String[] args){
int[] nums = new int[]{
7, 6, 8, 5};
//1.最后一位不符合,返回四位数
System.out.println("6879 --> " + getMaxNum(nums, "6879"));
//2.所有位不符合,返回三位数
System.out.println("5555 --> " + getMaxNum(nums, "5555"));
//3.中间位不符合,返回四位数
System.out.println("5698 --> " + getMaxNum(nums, "5698"));
//4.相等
System.out.println("5678 --> " + getMaxNum(nums, "5678"));
//5.不存在更小的数,返回-1
System.out.println("1 --> " + getMaxNum(nums, "1"));
}
//输出小于target的最大数,用nums中数字来拼凑,可以重复使用
public static int getMaxNum(int[] nums, String digit){
int d = Integer.parseInt(digit);
d--;
digit = String.valueOf(d);
StringBuilder sb = new StringBuilder();
//用于标记之后位是否可以直接取最大值
boolean flag = false;
//先对nums排序
Arrays.sort(nums);
//从目标数字的第一个字符开始,一个一个取
for(int i = 0; i < digit.length(