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