题目:如果整数x 满足:对于每个数位d*,这个数位恰好 在 x中出现d次。那么整数 x 就是一个 数值平衡数 。
给你一个整数 n,请你返回 严格大于n的 最小数值平衡数 。

思路:求出x中每个数位出现的次数,与数位本身比较

public class Solution4_11 {
    public static boolean f(int n) {
        //用一个数组记录n的每个数位出现的次数,数位=索引
        var arr = new int[10];
        var num = n;
        //用循环把num给拆开,对应的arr的索引加一,记录对应的数位有多少个
        while (num != 0) {
            var t = num % 10;
            ++arr[t];
            num /= 10;
        }
        //如果n的每个数位不等于它对应的索引的值,返回false,反之fan回true
        for (int i = 0; i < 10; i++) if (arr[i] != 0 & arr[i] != i) return false;
        return true;
    }

    public static int nextBeautifulNumber(int n) {
        var num = n + 1;
        while (true) {
            if (f(num)) return num;
            num++;
        }
    }
}

题目:给你一个仅由数字(0 - 9)组成的字符串* num
请你找出能够使用
num 中数字形成的 最大回文 整数,并以字符串形式返回。该整数不含前导零 。

思路:找到num中数量超过1的字符,越大放在越前面,和后面,比如,998877,变成987789
放完之后,找到还剩下的最大的单个字符,放在最中间,0不能放在最前面

public class Solution4_13 {
    public String largestPalindromic(String num) {
        int[] arr = new int[10];//arr用来存num中与arr的索引对应的字符的数量
        //用一个循环把num里的字符拆开放到arr里,比如998877,arr[9]=2,arr[8]=2,arr[7]=2
        for (int i1 = 0; i1 < num.length(); i1++) ++arr[Integer.parseInt(num.substring(i1, i1 + 1))];
        //如果num全是0,直接返回0
        int j;
        for (j = 9; j >= 0; j--) if (arr[j] > 0) break;
        if (j == 0) return String.valueOf(0);
        StringBuilder stringBuilder = new StringBuilder();
        int n = 0;//记录已经插入2n个字符
        for (int i = 9; i >= 0; i--)//i遍历arr
            for (int k = n; k <= i + n; k++)//k是需要返回的字符串的索引
                //对应字符数量超过1
                if (arr[i] > 1) {
                    if (i == 0 & k == 0) break;//第一位不能放0
                    stringBuilder.insert(k, i);
                    stringBuilder.insert(stringBuilder.length() - n, i);//
                    arr[i] -= 2;
                    n++;
                } else break;
        for (n = 9; n >= 0; n--) if (arr[n] == 1) break;//找出剩下的最大的字符
        if (n >= 0) stringBuilder.insert(stringBuilder.length() / 2, n);//插入到stringBuilder中间
        return stringBuilder.toString();
    }
}

题目:有m个无差别苹果,n个无差别盘子,返回总放置方法数。

注意,如果有5个苹果,3个盘子,1,1,3     1,3,1     3,1,1这三种方法是一种方法

思路1:总的方法数量=全部使用盘子的方法数量+不全部使用盘子的方法数量

public static int put01(int apple, int plate) {//剩余苹果数量,剩余盘子数量
        if (apple == 0) return 1;//没苹果了,一种方法
        if (plate == 0) return 0;//没盘子了,0种方法
        if (plate > apple) return put01(apple, apple);//盘子数量大于苹果,多余的盘子不要
        /*
        既有苹果又有盘子,且苹果数大于等于盘子数,两种情况,
        全部使用盘子,和不全部使用盘子,
        全部使用盘子就是先在每个盘子上放一个苹果,
        不全部使用盘子就是减掉一个盘子
        */
        else return put01(apple - plate, plate) + put01(apple, plate - 1);
    }

思路2:本次递归所得到的方法的数量=剩余苹果的数量-去上一个盘子使用的苹果数量+1

  public static int put02(int Last, int apple, int plate) {  //上一个盘子里的苹果数量,剩余苹果数         量,剩余盘子数量
        //测试时Last为1,因为盘子里无论如何都要有一个苹果
        if (apple == 0) return 1;//没苹果了,一种方法
        if (plate == 0) return 0;//没盘子了,0种方法
        if (Last > apple) return 0;//上一个盘子的苹果数量大于剩余苹果数量,代表之前的分配是错的,0种方         法
        int n = 0;
        for (int i = Last; i <= apple; i++) {
            n += put02(i, apple - i, plate - 1);
        }
        return n;
    }
posted on 2023-04-14 21:53  雨霁留虹霓  阅读(35)  评论(0)    收藏  举报