分析: 由排序不等式,出现次数最多的字母显然应该给26。所以这个题目变成了统计每种字母出现的次数了,然后按照出现次数从大到小,依次分配从高到低的权值。这就是最朴素的贪心思想。
最后,我们来提供输入输出数据,由你来写一段程序,实现这个算法,只有写出了正确的程序,才能继续后面的课程。
输入输入一个字符串S(S的长度 <= 10000),S中没有除字母外的其他字符。输出由你将1-26分配给不同的字母,使得字符串S的完美度最大,输出这个完美度。输入示例dad输出示例77import java.io.PRintWriter;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Scanner;public class Sum { public static void main(String[] args) { Scanner in = new Scanner(System.in); PrintWriter out = new PrintWriter(System.out); String str = in.next(); int max = getMax(str); out.println(max); out.flush(); } /** * 计算传入字符串的最大完美度 * * @param str * @return */ public static int getMax(String str) { int max = 0; Map<Character, Integer> map = new HashMap<Character, Integer>(); String s = upper2Lower(str);// 将字符串转换为小写字母 char[] charArray = s.toCharArray();// 字符串转换为字符数组 // 遍历字符数组,通过map统计每个字符的出现次数 for (char c : charArray) { if (!map.containsKey(c)) { map.put(c, 1); } else { map.put(c, map.get(c) + 1); } } // 遍历map,获得每个字符出现的次数,并将所有字符出现次数封装到list中 List<Integer> list = new ArrayList<Integer>(); for (Map.Entry<Character, Integer> m : map.entrySet()) { Character key = m.getKey(); Integer value = m.getValue(); list.add(value); // System.out.print(key + ":" + value.toString() + " "); } Object[] array = list.toArray(); Arrays.sort(array);// 对每个字符出现的次数进行升序排列 // System.out.println(Arrays.toString(array)); int[] perfect = new int[array.length];// 新建数组,长度和 array 一致(有多少字符,长度就是多少) int p = 26; for (int i = array.length - 1; i >= 0; i--) { if (p >= 1) { // 将每个字符的完美度值封装到数组中 perfect[i] = (int) array[i] * (p--); } } // 遍历perfect数组,将每个字符的完美度值累加,获取字符串的完美值 for (int i = 0; i < perfect.length; i++) { max = max + perfect[i]; } return max; } /** * 将大写字母转换为小写字母 * * @param str * @return */ private static String upper2Lower(String str) { String lower = str.toLowerCase(); return lower; }}
新闻热点
疑难解答