题目:
老板给度度熊n个数, 每一次从a[i]中取出一个最大的减去n, 其他的n-1个数加上1, 一直重复直到最大的a[i]<n, 执行次数记为k。
老板想知道最少执行多少次操作使得n个数都小于n呢?
输入描述:
第一行一个数n(2<=n<=50)。 第二行n个数表示数列a[i](1<=a[i]<=10^18)。
输出描述:
一个数表示K
输入例子1:
3 1 0 3
输出例子1:
1
难点:
1)字符串数组转Integer类型的集合
2)Integer类型的集合转换回字符串数组
解题思路:
1)判断是否符合条件,若不符合条件则往下执行,符合条件返回执行次数
2)字符串数组转Integer类型的集合
3)Integer类型的集合排序
4)最大的数减n,其余数加1
5)Integer类型的集合转字符串数组
6)将新数组赋给原字符串数组,返回步骤1
代码:
import java.util.*;
public class test0 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
Scanner scanner1 = new Scanner(System.in);
String s = scanner1.nextLine();
String[] strings = s.split(" ");
System.out.println(demo(i,strings));
}
private static int demo(int i,String[] strings){
int j = 0;
while(!isLowerN(i,strings)){
strings = doIt(i,strings);
j++;
}
return j;
}
private static String[] doIt(int i,String[] strings){
ArrayList<Integer> arrayList = new ArrayList<>();
for (String s:strings
) {
arrayList.add(Integer.parseInt(s));
}
arrayList.sort(Comparator.naturalOrder());
for (int j = 0; j < arrayList.size()-1; j++) {
arrayList.set(j,arrayList.get(j)+1);
}
arrayList.set(arrayList.size()-1,arrayList.get(arrayList.size()-1)-i);
ArrayList<String> arrayList1 = new ArrayList<>();
for (Integer i1:arrayList
) {
arrayList1.add(i1.toString());
}
String[] strings1 = new String[i];
arrayList1.toArray(strings1);
return strings1;
}
//如果所有都小于n,则返回true,否则返回false
private static boolean isLowerN(int i,String[] strings){
boolean isLowerN = true;
for (String s:strings
) {
if ((i-Integer.parseInt(s))>0){
continue;
}else {
isLowerN = false;
return isLowerN;
}
}
return isLowerN;
}
}
结果:
第一次输入总共有多少个数,第二次输入数组,输入的数组元素用空格隔开
输入例子1测试:
3
1 0 3
1
输入其他,以debug模式测试(断点打在doIt函数的return处,查看返回的字符串数组是否有误):
输入:
4
3 5 1 2
5
通过手算验证后,每次返回的字符串数组正确。
总结:
我会分享一些有意思的算法题,与君共勉。如果有更好的解题思路欢迎分享,如果本文有不正确的地方欢迎指正。