华为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。

时间: 2024-10-12 19:58:42

华为OJ 名字美丽度的相关文章

华为0基础——名字的美丽度

值得注意:对于每一个名字来说:名字的美丽度=26*字母个数最多的+25*字母个数其次的+24*字母个数再其次的-- 源程序: #include<iostream> #include<string> using namespace std; const int M=50; int main() { int n,i,j,k,len; int beauti[M]={0}; int t; cin>>n; char a[M][30]; for(i=0;i<n;i++) ci

【华为OJ】【083-计算字符串的相似度】

[华为OJ][算法总篇章] [华为OJ][083-计算字符串的相似度] [工程下载] 题目描述 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把"a"替换为"b". 2 增加一个字符,如把"abdd"变为"aebdd". 3 删除一个字符,如把"travelling"变为"traveling"

华为初级——名字的漂亮度

值得注意:对于每个名字来说:名字的漂亮度=26*字母个数最多的+25*字母个数其次的+24*字母个数再其次的-- 源程序: #include<iostream> #include<string> using namespace std; const int M=50; int main() { int n,i,j,k,len; int beauti[M]={0}; int t; cin>>n; char a[M][30]; for(i=0;i<n;i++) cin

【华为OJ】【033-名字的漂亮度】

[华为OJ][算法总篇章] [华为OJ][033-名字的漂亮度] [工程下载] 题目描述 给出一个名字,该名字有26个字符串组成,定义这个字符串的"漂亮度"是其所有字母"漂亮度"的总和. 每个字母都有一个"漂亮度",范围在1到26之间.没有任何两个字母拥有相同的"漂亮度".字母忽略大小写. 给出多个名字,计算每个名字最大可能的"漂亮度". 输入描述 整数N,后续N个名字 N个字符串,每个表示一个名字 输出描

【华为OJ】【046-成绩排序】

[华为OJ][算法总篇章] [华为OJ][046-成绩排序] [工程下载] 题目描述 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理. 例示: jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter 96 jack 70 Tom 70 smith 67 从低到高 smith 67 Tom 70 jack 70 peter 96 输入描述 输入多行,先输入要排序的人的个数,然后分别输入

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

华为OJ:汽水瓶

题目有点像小学数学题,因为三个空瓶可以换一瓶汽水,但喝完一瓶汽水就可以得到一个空瓶.所以相当于两个空瓶就可以换到一瓶汽水. 把输入除以2即可.这里讲一下java多出入,可以用in.hasNext(),就相当于C/C++里面的while(scanf("%d",n)!=EOF). import java.util.Scanner; public class qishuiping { public static void main(String args[]){ Scanner input=

华为OJ:分段排序

题目有点绕,一个是要二分,用三个字符串,存前,中,后三个,前,后部分都降序排序,然后后半部分再反转一下,讲三部分合起来就好了. import java.util.Scanner; public class dividesort { public static void sort(StringBuffer s){ for(int i=0;i<s.length();i++){ for(int j=i;j<s.length();j++){ if(s.charAt(i)>s.charAt(j))

华为OJ:2290 字符串最后一个单词的长度

用JAVA就很简单,只要用spilt函数,再输出最后一个字符串. 题意是要求你先自己写分隔好字符串这样子.有个比较坑的地方就是测试用例应该有个全为空的,要注意. import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); String ss[]=s.spli