华为OJ训练之0001-161226-名字的漂亮度

题目

给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。

题目分析:

根据题意  应该使出现次数最多的字母赋予最大的漂亮度  依次赋予第二大的 可使名字的漂亮度最大

程序分析:

统计名字中字母出现的次数

排序

从大到小分配漂亮度

计算漂亮度


程序代码

正确 得分100


import java.util.Scanner;




public class oj001 {

    private int[]  mCount=new int[26];   //用于统计字母的出现次数   需初始化为0后使用  
    private  final  int CHARCHOUNT=26; 

    //初始化计数数组
    public void initCount()
    {
        for(int i=0;i<CHARCHOUNT;i++)
        {
            mCount[i]=0;
        }
    }

    public int getMax(String name)
    {
        int sum=0;

        initCount();
        getCount(name);
        sum=getMaxSum();

        return sum;
    }

    //计算最大可能的漂亮度
    private int getMaxSum() {
        int  beauty=CHARCHOUNT;
        int sum=0;

        int maxCount=-1;
        while((maxCount=getMaxCount())>0)
        {
            //display(maxCount+"");
            sum+=beauty*maxCount;
            beauty--;
        }


        return sum;
    }


    public int getMaxCount()
    {
        int count=0;
        int maxIndex=-1;
        for(int i=0;i<CHARCHOUNT;i++)
        {
            if(mCount[i]>count)
            {
                count=mCount[i];
                maxIndex=i;
            }

        }

        if(maxIndex>=0)                //bug 记录  忽略了等于0的情况  
        {
        mCount[maxIndex]=0;//取出最大的之后 将此数字清空 便于下次取出最大的
        }
        return count;

    }

    //总计名字中字母出现次数
    private void getCount(String name) {

        for(int i=0;i<name.length();i++)
        {
            int index=name.charAt(i)-'a';
            mCount[index]++;
        }


    }

    private void display(String str)
    {
        System.out.println(str);
    }


public static void main(String[] args) {


    Scanner scanner=new Scanner(System.in);
    int sum=scanner.nextInt();
    while(sum-->0)
    {
        int maxSum=new oj001().getMax(scanner.next());
        System.out.println(maxSum);
    }


}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值