本帖最后由 godmmm 于 2014-11-27 19:34 编辑
题目:我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同, 而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是一样的。 现在给定一个字符串,输出它的最大可能的完美度。 例如:dad,你可以将26分配给d,25分配给a,这样整个字符串最大可能的完美度为77。
考点:键盘接收、判断字母字符串、大小写转化、获取每个字母出现的次数、字母和数组组合求最大值的算法、map集合存放有关系的数据对
思路:1、键盘接收字符串
2、读取一行判断是否为字母字符串,如果是者先转化为小写
3、获取每个字母出现的次数
4、获取最大值----- 算法的思路(次数出现最多的字母分配最大的整数)
- import java.io.*;
- import java.util.*;
- import java.util.Map.Entry;
- public class Test5 {
- public static void main(String[] args) {
- //键盘录入
- String str="";
- BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
- try {
- //读取一行
- str=buf.readLine();
- } catch (IOException e) {
- e.printStackTrace();
- }
- if(isOk(str)){//调用字母字符串判断方法
- getMax(str);
- }
- else{
- System.out.println("请输入字母字符串!!!");
- }
- }
- public static void getMax(String str){
- int Max=0;//定义一个最大值来记录获取的最大值
- int num=26;//定义x来记录26;
- str=str.toLowerCase();//转化为小写
- char arr[]=str.toCharArray();//字符串转化为字符数组
- Arrays.sort(arr);//排序
- Map<Character,Integer> map=new TreeMap<Character,Integer>();//定义个map集合来存字符串
- for(int x=0;x<arr.length;x++){//遍历数组,存入字母和字母出现的次数
- if(map.containsKey(arr[x])){
- int value=map.get(arr[x]);
- value++;
- map.put(arr[x], value);
- }
- else{
- map.put(arr[x], 1);
- }
- }
- System.out.println("各字母出现的次数"+map);//测试是否获取字母的出现次数
- ArrayList<Integer> al=new ArrayList<Integer>();//list集合存放map集合的vale值,
- Set<Entry<Character, Integer>> set=map.entrySet();//获取entry对象
- Iterator<Entry<Character, Integer>> it=set.iterator();//获取迭代器
- while(it.hasNext()){//遍历set集合
- Entry<Character, Integer> en =it.next();
- al.add(en.getValue());//去除map集合的值添加到list集合中
- }
- Collections.sort(al,Collections.reverseOrder());//对list集合排序从大到小
- System.out.println("次数排序:::"+al);//打印list集合
- for(Integer i:al){//遍历集合,计算最大数
- Max=Max+i*num;
- num--;
- }
- System.out.println("完美度为:::"+Max);//打印最大数
- }
- public static boolean isOk(String str){
- if(str.matches("[a-zA-Z]+?")){//正则匹配字母字符串
- return true;
- }
- else{
- return false;//不满足
- }
- }
- }
复制代码
|
|