【字节跳动-面试题】最大数

6,332 阅读1分钟

题目:给定一个数n如23121;给定一组数字a如[2 4 9],求由a中元素组成的小于n的最大数

多测试样例:leetcode.cn/circle/disc… 代码参考:blog.csdn.net/Oblak_ZY/ar…


思路:

数字从左往右分析。 数组是递增有序的,从右往左分析,也就是先取最大的,再取次大的。 目的:在数组中找到等于该位的元素或者小于该位元素的最大值

  • 如果数组中当前元素小于数字该位的值,就取上该最大元素,后面就不用分析了,全部填充该最大元素
  • 如果数组中当前元素等于数字该位的值,就继续分析数字的下一位
  • 如果数组中最小的元素都大于数字该位的值,就看一下当前分析的数字位数是第几位。如果是第一位,则继续从第二位开始;如果不是第一位,就退回一步

public class myTest {

    static int value = 24132;
    static String str = String.valueOf(value);
    static int[] arr = {1,4,9};

    static boolean DFS(int index, boolean flag, int sum, int[] arr){

        if(index==str.length()){
            System.out.println(sum);
            return true;
        }
        if(flag){
            return DFS(index+1,true,sum*10+arr[arr.length-1],arr);
        }
        else {
            int tmp = str.charAt(index)-'0';
//            System.out.println(tmp);
            for(int i=arr.length-1;i>=0;i--){
                if(arr[i]==tmp){
                    if(DFS(index+1,false,sum*10+arr[i],arr)){
                        return true;
                    }
                } else if (arr[i]<tmp) {
                    if(DFS(index+1,true,sum*10+arr[i],arr)){
                        return true;
                    }
                }
            }
        }
        // 数组中最小的元素都大于数字该位的值
        if(index!=0) return false;  // 回溯一步(退回一步)
        else return DFS(index+1,true,sum,arr);
    }

    public static void main(String[] args) {
        DFS(0,false,0,arr);
    }
}