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

105 篇文章 155 订阅

【华为OJ】【算法总篇章】


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

【工程下载】


题目描述

给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。

输入描述

整数N,后续N个名字
N个字符串,每个表示一个名字

输出描述

每个名称可能的最大漂亮程度

输入例子

2 zhangsan lisi

输出例子

192 101

算法实现

import java.util.*;

/**
 * Author: 王俊超
 * Date: 2015-12-24 15:26
 * All Rights Reserved !!!
 */
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            List<String> list = new ArrayList<>();
            while ((--n) >= 0) {
                list.add(scanner.next());
            }
            System.out.print(count(list));
        }

        scanner.close();
    }

    /**
     * 计算字符的最大可能是漂亮度,计算方式为对字符串的数字按出现频率的调到低排序,最高的赋26,下一个赋25,以此类推
     *
     * @param list
     * @return
     */
    private static String count(List<String> list) {


        StringBuilder builder = new StringBuilder();

        for (String s : list) {
            int result = 0;
            int[] seq = new int[26];

            // 统计每个字母出现的次数,不区分大小写
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                // 如果是小写
                if (c >= 'a' && c <= 'z') {
                    seq[c - 'a']++;
                }
                // 大写
                else {
                    seq[c - 'A']++;
                }
            }

            // 按出现的次序从小到大排序
            Arrays.sort(seq);

            // 计算最大漂亮程度
            for (int i = 0; i < seq.length; i++) {
                result += seq[i] * (i + 1);
            }


            builder.append(result).append('\n');
        }

        return builder.toString();
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值