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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© daoqin 高级黑马   /  2014-9-29 20:42  /  6329 人查看  /  29 人回复  /   4 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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.         }
复制代码





评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

29 个回复

倒序浏览
这个方法很好,很有启发,收藏了!
回复 使用道具 举报
方法很好,多谢分享
回复 使用道具 举报
思想很好。。。
回复 使用道具 举报
楼主很好的思路,赞
回复 使用道具 举报
解题思路很妙
回复 使用道具 举报
思路很好,不过功能太局限,如果说的是任何字符呢
回复 使用道具 举报
daoqin 高级黑马 2014-9-30 10:17:08
8#
本帖最后由 daoqin 于 2014-9-30 10:20 编辑
哈达洋 发表于 2014-9-30 10:03
思路很好,不过功能太局限,如果说的是任何字符呢

当然可以,只要是ascii码表(包括扩展的)的,就可以统计!主要是根据题目需求采用什么方法了,如果要统计汉字,这个就不行了!
回复 使用道具 举报
华谦 中级黑马 2014-9-30 10:21:52
9#
恩,不错
回复 使用道具 举报
这种统计算法确实不错哦
回复 使用道具 举报
呵呵 都是看视频后才做的题 要是视频没这道题 估计大家用的方法就多了
回复 使用道具 举报
Imp_x 高级黑马 2014-10-4 22:26:15
12#
我是来看一百个哈姆雷特的{:3_67:}
回复 使用道具 举报
谢谢分享!
回复 使用道具 举报
也是有点启发
回复 使用道具 举报
暂时没看懂,收藏明天继续看...
回复 使用道具 举报

最快的排序

本帖最后由 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.                 }
复制代码
回复 使用道具 举报 1 0
daoqin 高级黑马 2014-10-24 23:08:43
17#
waylent 发表于 2014-10-5 00:19
楼主的方法真的非常巧妙。针对这道题完成的很好。在这里做一个小小的扩展,就是把字符串改为一个不同数字的 ...

嗯,很棒,你的脑子很活,给你出个题目,如果你想出来,我送你我全部的30黑马币!
假如有“abc”“bcd”“ghe”“sdetr”“iendkg”等n个字符串,对他们按照字典顺序排序,不准借用java集合、不准使用java自带的排序;想想用一个巧妙的方法算出来,提示:使用n个26个数组空间大小也许就可以搞定。
回复 使用道具 举报
楼主 这个思想我们老师也提到过 说的很好!受用了 谢谢!!!
回复 使用道具 举报
方法果然很巧妙
回复 使用道具 举报
num[buf[i]]++;    怎么理解?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马