哥俩好Java实现
题干
Description
数字 x,y 是个「哥俩好」数字,当且仅当数字 x 的数位和与数字 y 的数位和相同。
你需要找 n 个不同的正整数,使得这 n 个数字两两之间均为「哥俩好」数字且总和最小。
Input
一个整数 n , 1≤n≤5000
Output
最小的「哥俩好」数字总和。
题解思路
将一定范围内(例如1-200000)的数按照数位和分组保存。分组结束后,对各组前n位数相加,排序得到最小的数字和。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Buddy {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int target=scanner.nextInt();
List<ArrayList<Integer>> storage=new ArrayList<>();//用存放集合的集合
for(int m=0;m<=54;m++){//初始化存储分组后数字的集合
storage.add(new ArrayList<>());
}
//分组
for(int i = 1;i<300000;i++){
int sum=count(i);
storage.get(sum).add(i);
}
long out=999999999;
for(int j=1;j<storage.size();j++){
if(storage.get(j).size()>=target){//找到size>=n的集合,即保证在这个集合里有足够多的哥俩好数字
long local=0;
for(int k=0;k<target;k++){
local+=storage.get(j).get(k);
}
if(local<out){//也可以选择把local存起来,用Collection Sort一下
out=local;
}
}
}
System.out.println(out);
}
static int count(int i){//求数位和的静态方法
String[] test=String.valueOf(i).split("");
int sum=0;
for(int j=0;j<test.length;j++)
{
sum +=Integer.parseInt(test[j]);
}
return sum;
}
}