您的位置:首页 > 编程语言 > Java开发

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

2017-03-19 16:25 465 查看

题目

给出一个名字,该名字有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);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为OJ Java