题目:如果整数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;
}
标签:arr,return,14,int,num,苹果,盘子
From: https://www.cnblogs.com/wxlxy/p/17320062.html