黑马程序员技术交流社区

标题: 面试的一道题分享 [打印本页]

作者: Rain2692    时间: 2014-12-14 22:56
标题: 面试的一道题分享
本帖最后由 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.   }
复制代码

作者: Rain2692    时间: 2014-12-14 22:59
占个沙发。。。。
作者: LOVE你的ME    时间: 2014-12-14 23:13
神马面试题啊,视频面试的题吗?
作者: 找寻小龙猫    时间: 2014-12-14 23:33
没看明白题意。。。
作者: 黄小橙    时间: 2014-12-15 00:04
谢谢lz分享!~~~~
作者: biebie    时间: 2014-12-15 00:36
思路是先确定字符串中各字符的出现次数,用treemap装上后次数最多的字母赋值26,然后依次递减再计算总值
作者: wangcongwu    时间: 2014-12-15 00:41
我真不明白为啥要这么多如果最大是26的话 不到26就不返回不行吗不配到26 和25 不往回统计不好吗为啥这么费劲呢
作者: 董晗    时间: 2014-12-15 00:49
感谢分享
作者: 杜庆娇    时间: 2014-12-15 08:49
没看懂:L
作者: sam3say    时间: 2014-12-15 08:51
先来赞一个
作者: 菜鸟一号    时间: 2014-12-15 09:23
写得很清晰,赞一个!希望楼主下次备注一下!
作者: cczheng    时间: 2014-12-15 09:41
这个题一次技术分获取活动中出现过
作者: 滴水石穿    时间: 2014-12-15 09:57
这个面试题真有水平啊
作者: Rain2692    时间: 2014-12-15 11:13
杜庆娇 发表于 2014-12-15 08:49
没看懂

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

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

不理解你的意思。。。。仔细看题的意思,就行了
作者: 聪明叉    时间: 2014-12-15 12:47
应该再写清除思路的,一步步的思考过程
想要得到最大完美度,就要把最大数(26)赋给出现次数最多字符

1. 使用map集合,统计输入字符串每个字符出现的次数(不明白的去温习老毕map集合的视频)
2. 将字符出现的次数存入int数组
3. 将int数组排序,大数在前,小数在后
4. 将int数组从0角标遍历,依次乘以26、25、24。。。。再求和
作者: 随便吧    时间: 2014-12-15 12:50
题目看明白啦。。
作者: zhouli_2014    时间: 2014-12-15 15:18
不明觉厉~
作者: taany    时间: 2014-12-15 16:32
目前还不会做
作者: qq8921310    时间: 2014-12-15 18:06
完美度就是随便给字母付一个数字么?

作者: Rain2692    时间: 2014-12-15 19:28
qq8921310 发表于 2014-12-15 18:06
完美度就是随便给字母付一个数字么?

不是看题目。。。
作者: Dr.Sparta    时间: 2014-12-15 21:22
感谢分享
作者: wzl963358694    时间: 2014-12-15 21:37
不错慢慢的正能量
作者: ln0491    时间: 2015-11-10 10:51
没太明白
作者: fury1994    时间: 2016-1-27 10:25
youxi ~~~~~~~~~
作者: xiaojunru    时间: 2016-3-13 19:41
很有深度
作者: xiaojunru    时间: 2016-3-28 20:40
太难了,有难度
作者: 颓废不孤单    时间: 2016-10-3 23:21
不会做,主要是不理解什么是完美度,开始还以为的完全数,搞了老半天没搞懂




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2