zoukankan      html  css  js  c++  java
  • 字节笔试真题-最大映射

    题目:

    有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?


    输入描述:

    每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。


    输出描述:

    输出一个数,表示最大和是多少。


    输入例子1:
    2
    ABC
    BCA

    输出例子1:
    1875
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Scanner;
    
    //写代码的时候,整个类都要从0开始建,然后写main方法,并在其中调用写的方法
    public class DailyNews1 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
              // 命令行接受输入
            Scanner scanner = new Scanner(System.in);
            while (scanner.hasNext()) {
                int n = scanner.nextInt();
                String[] strs = new String[n];
                for (int i = 0; i < n; i++) {
                    strs[i] = scanner.next();
                }
                  //调用方法
                System.out.println(maxSum(n, strs));
            }
        }
         //方法主体
        public static long maxSum(int n, String[] strs) {
            long sum = 0; // 返回的最大和
            HashMap<Character, Long> map = new HashMap<Character, Long>();
            ArrayList<Character> headList = new ArrayList<Character>();
            for (int i = 0; i < n; i++) {
                setWeight(strs[i], map, headList);
            }
            // 按照各个字符的权重进行排序
            ArrayList<Map.Entry<Character, Long>> list = new ArrayList<Map.Entry<Character, Long>>(map.entrySet());
              //这个是干啥
            Collections.sort(list, new Comparator<Map.Entry<Character, Long>>() {
    
                @Override
                public int compare(Entry<Character, Long> arg0, Entry<Character, Long> arg1) {
                    // TODO Auto-generated method stub
                    return arg0.getValue() > arg1.getValue() ? -1 : 1; // 根据字符的权重进行从大到小排序
                }
            });
            int number = 9;// 最大的数字
            // 除去头元素为0的情况 办法:将权重最小的且不是头元素的第一个字符放置在映射值为0的位置
            if (list.size() == 10) {
                for (int i = 9; i >= 0; i--) {
                    if (!headList.contains(list.get(i).getKey())) {// 满足权重最小的且不是头元素的第一个字符
                        list.remove(i); // 去除就相当于放置在映射值为0的位置
                        break;
                    }
                }
            }
            for (Entry<Character, Long> entry : list) {
                sum += entry.getValue() * number;
                number--;
            }
            return sum;
        }
    
        // 设置每个字符串中每个字符的权重,并保存首字符
        public static void setWeight(String string, HashMap<Character, Long> map, ArrayList<Character> headList) {
            char[] cs = string.toCharArray();
            long init = 1;
            for (int i = cs.length - 1; i >= 0; i--) {
                if (map.containsKey(cs[i])) {
                    map.put(cs[i], map.get(cs[i]) + init);
                } else {
                    map.put(cs[i], init);
                }
                init *= 10;
            }
            headList.add(cs[0]);
        }
    }

      

    [ 版权声明 ]: 本文所有权归作者本人,文中参考的部分已经做了标记! 商业用途转载请联系作者授权! 非商业用途转载,请标明本文链接及出处!
  • 相关阅读:
    iscroll 子表左右滚动同时保持页面整体上下滚动
    mac xampp命令行调用mysql
    学习—ReentrantLock
    sychronized和lock的区别
    学习——常见垃圾回收器
    学习——java内存模型
    学习——哈夫曼编码
    数据库—Innodb中的MVVC
    学习-事务-事务特性
    学习——事务-事务隔离级别
  • 原文地址:https://www.cnblogs.com/gslgb/p/14531911.html
Copyright © 2011-2022 走看看