哥俩好Java实现

哥俩好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;
    }
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值