华为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); } } }