华为OJ 名字美丽度

Posted jhcelue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为OJ 名字美丽度相关的知识,希望对你有一定的参考价值。

这是一道坑爹的题目,为什么这么说,且看我慢慢分析……
题目例如以下:
给出一个名字,该名字有26个字符串组成,定义这个字符串的“美丽度”是其全部字母“美丽度”的总和。


每一个字母都有一个“美丽度”。范围在1到26之间。没有不论什么两个字母拥有同样的“美丽度”。字母忽略大写和小写。
给出多个名字。计算每一个名字最大可能的“美丽度”。


输入:
整数N。后面N个名字,如
2 zhangsan lisi
输出:
每一个名字相应的最大美丽程度
如:192 101

题目分析:
这道题目乍一看,挺厉害的。可是一分析就发现这事实上就是求一个字符串中每一个字符的出现次数,为了获得最大的美丽度那么必须让出现次数最多的字符美丽度为26,依次递减往下。
有了解题思路。直接上代码,代码例如以下,Java实现

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {

    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int N=scanner.nextInt();
        String[] names=new String[N];
        Main main=new Main();
        for (int i = 0; i < N; i++) {
            names[i]=scanner.next();
                System.out.println(main.beautyfulNames(names[i]));//为何是System.out.println()。后面解释
        }

        scanner.close();
    }

    public int beautyfulNames(String name){
        char[] c=name.toCharArray();
        Map<Character, Integer> map=new HashMap<Character,Integer>();
        for (int i = 0; i < c.length; i++) {
            if (map.containsKey(c[i])) {
                map.put(c[i], map.get(c[i])+1);
            }else {
                map.put(c[i], 1);
            }       
        }

        List<Map.Entry<Character, Integer>> list=new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
        //Collections.sort重载方法来实现排序
        Collections.sort(list,new Comparator<Map.Entry<Character, Integer>>() {

            public int compare(Map.Entry<Character, Integer> o1,Map.Entry<Character, Integer> o2){
                return o2.getValue().compareTo(o1.getValue());//降序排列
//              return o1.getValue().compareTo(o2.getValue());//升序排列
            }
        });

        int result=0;
        for (int i = 0; i < list.size(); i++) {
            result=result+list.get(i).getValue()*(26-i);
        }
        return result;

    }

}

看到我的这段代码。你肯定会说这么输出是不正确的,由于题目给的输出实例中明显是都在一行……可是我告诉你这么是对的,这就是我说这道题坑爹的原因所在。我第一提交的时候用的是System.out.print()。然后直接就提示说“格式错误”,不死心,我又提交第二次。依然“格式错误”,后来我抱着试试看的态度使用System.out.println()又一次提交,居然就对了。!

!!

——这么大一个公司,做事情到了如此不认真的地步,我也真是醉了……

标记为原创的博文均为本人辛苦码字所得,谢绝抄袭。转载请注明出处,新浪微博私信艾特:物联网project_Niegang。

以上是关于华为OJ 名字美丽度的主要内容,如果未能解决你的问题,请参考以下文章

华为OJ083-计算字符串的相似度

华为OJ平台——字符串分隔

第十二周oj题目将度分秒转换为弧度

第十二周oj题目将度分秒转换为弧度

华为OJ100-配制文件恢复

华为OJ076-蛇形矩阵