A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Rain2692 高级黑马   /  2014-12-14 22:56  /  3523 人查看  /  29 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Rain2692 于 2014-12-15 11:09 编辑

我们要给每个字母配一个1-26之间的整数,
具体怎么分配由你决定,但不同字母的完美度不同,
而一个字符串的完美度等于它里面所有字母的完美度之和,
且不在乎字母大小写,也就是说字母F和f的完美度是一样的。
现在给定一个字符串,输出它的最大可能的完美度。
例如:dad,你可以将26分配给d,25分配给a,
这样整个字符串最大可能的完美度为77。

  1.    public static void main(String[] args) throws Exception
  2.         {
  3.                 System.out.println("Please Input String:");
  4.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  5.                 String line =null;
  6.                
  7.                 while((line=bufr.readLine())!=null)
  8.                 {
  9.                     Count(line);
  10.                
  11.                  
  12.                 }
  13.         }


  14.         public static void Count(String line)
  15.         {
  16.              char[] arr = line.toLowerCase().toCharArray();//将所有的字母最小化,便于统计
  17.                  int count = 0;
  18.                  TreeMap<Character,Integer> tm = new TreeMap<>();//使用TreeMap,获取键值对,字母--数目
  19.                  for(int i=0;i<arr.length;i++)
  20.                  {
  21.                     if(!tm.containsKey(arr[i]))
  22.                          tm.put(arr[i],1);
  23.                                 
  24.                         else
  25.                          {
  26.                                 count = tm.get(arr[i]);
  27.                                 count++;
  28.                                 tm.put(arr[i],count);
  29.                          }
  30.                  
  31.                  }
  32.          
  33.                   int[] num = new int[tm.size()];
  34.                   int t = 0;
  35.            Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();//遍历Map集合,将值(数目)存到数组中num[]
  36.            for(Map.Entry<Character,Integer> me : entrySet)
  37.                   {
  38.                             System.out.println(me.getKey()+" : "+me.getValue());
  39.                             num[t]=me.getValue();
  40.                                 t++;
  41.                   }
  42.                  
  43.                   sort(num);//将数组中的元素从大到小排序
  44.                   
  45.                   count=0;
  46.                   for(int i = 26,j=0;j<num.length;i--,j++)//根据要求进行操作
  47.                   {
  48.                      count+=num[j]*i;
  49.                   
  50.                   }
  51.                  
  52.                   System.out.println("整个字符串最大可能的完美度为:"+count);
  53.         }



  54.   public static void sort(int[] num)
  55.   {
  56.      for(int i = 0;i<num.length-1;i++)
  57.                   {
  58.                        for(int j = 0;j<num.length-i-1;j++)
  59.                            {
  60.                               if(num[j]<num[j+1])
  61.                                    {
  62.                                      int temp = num[j+1];
  63.                                           num[j+1]= num[j];
  64.                                           num[j]=temp;
  65.                                   }
  66.                            }
  67.                   }
  68.   
  69.   }
复制代码

点评

我真的木有偏心的,,,并不是所有的都得点评的,也没那么多时间呢,你懂得!  发表于 2014-12-14 23:11

评分

参与人数 3技术分 +3 黑马币 +6 收起 理由
聪明叉 + 6 很给力!略牛逼,思路很清晰
李家汉子初养成 + 1
船长 + 2

查看全部评分

29 个回复

倒序浏览
占个沙发。。。。
回复 使用道具 举报
神马面试题啊,视频面试的题吗?
回复 使用道具 举报
没看明白题意。。。
回复 使用道具 举报
谢谢lz分享!~~~~
回复 使用道具 举报
思路是先确定字符串中各字符的出现次数,用treemap装上后次数最多的字母赋值26,然后依次递减再计算总值
回复 使用道具 举报
我真不明白为啥要这么多如果最大是26的话 不到26就不返回不行吗不配到26 和25 不往回统计不好吗为啥这么费劲呢
回复 使用道具 举报
董晗 来自手机 中级黑马 2014-12-15 00:49:35
8#
感谢分享
回复 使用道具 举报
没看懂:L
回复 使用道具 举报
先来赞一个
回复 使用道具 举报
写得很清晰,赞一个!希望楼主下次备注一下!
回复 使用道具 举报
cczheng 来自手机 中级黑马 2014-12-15 09:41:29
12#
这个题一次技术分获取活动中出现过
回复 使用道具 举报
这个面试题真有水平啊
回复 使用道具 举报

就是先统计一个字符串中的字母个数,然后指定一个完美数,使整个字符串的完美度最大
回复 使用道具 举报
biebie 发表于 2014-12-15 00:36
思路是先确定字符串中各字符的出现次数,用treemap装上后次数最多的字母赋值26,然后依次递减再计算总值 ...

恩,这个是题目的意思。。。使用简单的方法做的
回复 使用道具 举报
wangcongwu 发表于 2014-12-15 00:41
我真不明白为啥要这么多如果最大是26的话 不到26就不返回不行吗不配到26 和25 不往回统计不好吗为啥这么费 ...

不理解你的意思。。。。仔细看题的意思,就行了
回复 使用道具 举报
应该再写清除思路的,一步步的思考过程
想要得到最大完美度,就要把最大数(26)赋给出现次数最多字符

1. 使用map集合,统计输入字符串每个字符出现的次数(不明白的去温习老毕map集合的视频)
2. 将字符出现的次数存入int数组
3. 将int数组排序,大数在前,小数在后
4. 将int数组从0角标遍历,依次乘以26、25、24。。。。再求和
回复 使用道具 举报 1 0
题目看明白啦。。
回复 使用道具 举报
不明觉厉~
回复 使用道具 举报
taany 中级黑马 2014-12-15 16:32:54
20#
目前还不会做
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马