黑马程序员技术交流社区

标题: 杀鸡用牛刀不合适,分享一种解题思想 [打印本页]

作者: daoqin    时间: 2014-9-29 20:42
标题: 杀鸡用牛刀不合适,分享一种解题思想
本帖最后由 daoqin 于 2014-9-29 20:54 编辑

题目:取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,输出格式为:a(2)b(1)k(2)...
看到论坛上很多这个题目都是千篇一律的集合、map去解决,其实觉得没有那么复杂,数组就搞定了,通过查找ASCII码表,A-Z 65-90  a-z  97-122既然只要字母的数量,直接统计就行了,所以可以通过数组下标做标记的方式去解决这个问题:很多时候,我觉得解决问题,需要的是一种思想,代码越简单越容易解决问题。
  1. public static void main(String[] args) {
  2.                 String str = "abcdekka27qoq";
  3.                 char[] buf = str.toCharArray();
  4.                  int[] num = new int[123];
  5.                 for (int i = 0; i < buf.length; i++) {
  6.                         num[buf[i]]++;
  7.                 }
  8.                 for (int i = 0; i < num.length; i++) {
  9.                         if((i>=65 && i<=90) || (i>=97&& i<=122)){
  10.                                 if(num[i]>0){
  11.                                         System.out.print((char)i+"("+num[i]+")");
  12.                                 }
  13.                         }
  14.                 }
  15.         }
复制代码






作者: 李天富    时间: 2014-9-30 00:38
这个方法很好,很有启发,收藏了!
作者: 高泳    时间: 2014-9-30 02:05
方法很好,多谢分享
作者: 不系之舟王    时间: 2014-9-30 08:25
思想很好。。。
作者: 小城。    时间: 2014-9-30 08:35
楼主很好的思路,赞
作者: xplcc    时间: 2014-9-30 09:07
解题思路很妙
作者: 哈达洋    时间: 2014-9-30 10:03
思路很好,不过功能太局限,如果说的是任何字符呢
作者: daoqin    时间: 2014-9-30 10:17
本帖最后由 daoqin 于 2014-9-30 10:20 编辑
哈达洋 发表于 2014-9-30 10:03
思路很好,不过功能太局限,如果说的是任何字符呢

当然可以,只要是ascii码表(包括扩展的)的,就可以统计!主要是根据题目需求采用什么方法了,如果要统计汉字,这个就不行了!
作者: 华谦    时间: 2014-9-30 10:21
恩,不错
作者: 十万一千    时间: 2014-10-4 18:17
这种统计算法确实不错哦
作者: 郑飞    时间: 2014-10-4 20:47
呵呵 都是看视频后才做的题 要是视频没这道题 估计大家用的方法就多了
作者: Imp_x    时间: 2014-10-4 22:26
我是来看一百个哈姆雷特的{:3_67:}
作者: ye361571404    时间: 2014-10-4 23:09
谢谢分享!
作者: mtdanz    时间: 2014-10-4 23:33
也是有点启发
作者: shileishihai    时间: 2014-10-4 23:37
暂时没看懂,收藏明天继续看...
作者: waylent    时间: 2014-10-5 00:19
标题: 最快的排序
本帖最后由 waylent 于 2014-10-5 00:21 编辑

楼主的方法真的非常巧妙。针对这道题完成的很好。在这里做一个小小的扩展,就是把字符串改为一个不同数字的数组,这种方法还可以对比较小的数的数组进行排序,比如【21,73,90,1,2,11,32,25,25】,然后定义一个有91个元素的数组int[] num=new num[91],然后num[0]对应0数字出现的次数,num[1]对应1数字出现的次数,以此类推,num[90]对应90出现的次数。通过简单的循环就可以统计出各个数字的个数,然后再按序号输出,就是排好序的数组,代码如下:
  1.                 int[] example={21,73,90,1,2,11,32,25,25};
  2.                 int[] bucket=new int[91];
  3.                 for (int i=0;i<example.length;i++) {
  4.                         bucket[example[i]]++;
  5.                 }
  6.                 for (int i=0;i<bucket.length;i++) {
  7.                         for (int j=0;j<bucket[i];j++) {
  8.                                 System.out.print(i+" ");
  9.                         }
  10.                 }
复制代码

作者: daoqin    时间: 2014-10-24 23:08
waylent 发表于 2014-10-5 00:19
楼主的方法真的非常巧妙。针对这道题完成的很好。在这里做一个小小的扩展,就是把字符串改为一个不同数字的 ...

嗯,很棒,你的脑子很活,给你出个题目,如果你想出来,我送你我全部的30黑马币!
假如有“abc”“bcd”“ghe”“sdetr”“iendkg”等n个字符串,对他们按照字典顺序排序,不准借用java集合、不准使用java自带的排序;想想用一个巧妙的方法算出来,提示:使用n个26个数组空间大小也许就可以搞定。
作者: 安卓安小虾    时间: 2014-10-25 13:45
楼主 这个思想我们老师也提到过 说的很好!受用了 谢谢!!!
作者: 桂何钢    时间: 2014-10-25 14:40
方法果然很巧妙
作者: hj447842687    时间: 2014-11-9 03:38
num[buf[i]]++;    怎么理解?
作者: 邹中源    时间: 2014-11-10 09:39
坚持就会胜利,好东西就要分享
作者: -律-    时间: 2015-1-6 13:17
num[buf[i]]++;

还能这么用啊

num不是int类型的整形数组么,应该只能接受整数进去才对,可是居然还能放入字符数组进去,这我就有点理解不能了
作者: -律-    时间: 2015-1-6 13:26
本帖最后由 -律- 于 2015-1-6 14:02 编辑

if((i >= 65 && i <= 90) || (i >= 97 && i <= 122)){}
这一句代码可以省略为
if(i >= 97 && i <= 122){}
的吧,毕竟在题目中接收的字母中并没有大写的,所以可以省略这一个判断条件ASCII码中:
        65~90表示大写字母A~Z;
        97~122表示小写字母a~z.




作者: wenyu    时间: 2015-3-2 13:23
能讲解一下不?
作者: daoqin    时间: 2015-3-10 23:04
-律- 发表于 2015-1-6 13:26
if((i >= 65 && i = 97 && i = 97 && i

代码要严谨,你那么写算bug
作者: 猪猪fly侠    时间: 2015-5-7 20:27
方法太巧妙了还没看明白,好收藏了
作者: 午后阿怪    时间: 2015-8-11 22:57
很赞
作者: syusouki    时间: 2015-10-13 10:45
思想啊.....
作者: hdy105501    时间: 2015-10-20 23:46
赞一个,思路很好!
作者: 小小的程序员    时间: 2015-12-6 10:05
楼主威武脑子太灵活了




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