本帖最后由 Rain2692 于 2014-12-15 11:09 编辑
我们要给每个字母配一个1-26之间的整数,
具体怎么分配由你决定,但不同字母的完美度不同,
而一个字符串的完美度等于它里面所有字母的完美度之和,
且不在乎字母大小写,也就是说字母F和f的完美度是一样的。
现在给定一个字符串,输出它的最大可能的完美度。
例如:dad,你可以将26分配给d,25分配给a,
这样整个字符串最大可能的完美度为77。
- public static void main(String[] args) throws Exception
- {
- System.out.println("Please Input String:");
- BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
- String line =null;
-
- while((line=bufr.readLine())!=null)
- {
- Count(line);
-
-
- }
- }
- public static void Count(String line)
- {
- char[] arr = line.toLowerCase().toCharArray();//将所有的字母最小化,便于统计
- int count = 0;
- TreeMap<Character,Integer> tm = new TreeMap<>();//使用TreeMap,获取键值对,字母--数目
- for(int i=0;i<arr.length;i++)
- {
- if(!tm.containsKey(arr[i]))
- tm.put(arr[i],1);
-
- else
- {
- count = tm.get(arr[i]);
- count++;
- tm.put(arr[i],count);
- }
-
- }
-
- int[] num = new int[tm.size()];
- int t = 0;
- Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();//遍历Map集合,将值(数目)存到数组中num[]
- for(Map.Entry<Character,Integer> me : entrySet)
- {
- System.out.println(me.getKey()+" : "+me.getValue());
- num[t]=me.getValue();
- t++;
- }
-
- sort(num);//将数组中的元素从大到小排序
-
- count=0;
- for(int i = 26,j=0;j<num.length;i--,j++)//根据要求进行操作
- {
- count+=num[j]*i;
-
- }
-
- System.out.println("整个字符串最大可能的完美度为:"+count);
- }
- public static void sort(int[] num)
- {
- for(int i = 0;i<num.length-1;i++)
- {
- for(int j = 0;j<num.length-i-1;j++)
- {
- if(num[j]<num[j+1])
- {
- int temp = num[j+1];
- num[j+1]= num[j];
- num[j]=temp;
- }
- }
- }
-
- }
复制代码 |