金山公司面试题:一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数,如有多个重复的则都求出。

此题的解题思路如下:

  1. 引入TreeSet:通过集合快速找到所有出现过的字符串
  2. 引入ArrayList:为了快速排序,再通过StringBuffer生成排序后的字符串
  3. 通过String的indexOf方法和lastIndexOf方法来计算每个字符串出现的次数最大值
  4. 使用HashMap存储出现多的字符串和次数

代码如下:
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.HashMap;
  4. import java.util.Iterator;
  5. import java.util.Map;
  6. import java.util.TreeSet;
  7.  
  8. public class SortTest {
  9. public static void main(String[] args) {
  10. String input = "httpblogcsdnnetouyangpeng";
  11. new SortTest().doString(input);
  12. }
  13.  
  14. public void doString(String input) {
  15. /**
  16. * 第一步:
  17. * 使用TreeSet快速找到所有出现的字符串
  18. * 将输入的字符串按升序排列
  19. */
  20. //将String转换为字符数组
  21. char[] chars=input.toCharArray();
  22. ArrayList<String> lists=new ArrayList<String>();
  23. //TreeSet是一个有序集合,TreeSet中的元素将按照升序排列
  24. //通过TreeSet的不重复性,快速找到所有出现的字符串
  25. TreeSet<String> set=new TreeSet<String>();
  26. for (int i = 0; i < chars.length; i++) {
  27. lists.add(String.valueOf(chars[i]));
  28. set.add(String.valueOf(chars[i]));
  29. }
  30. //set= [a, b, c, d, e, g, h, l, n, o, p, s, t, u, y]
  31. System.out.println("set= "+set);
  32. //排序
  33. Collections.sort(lists);
  34. //lists= [a, b, c, d, e, e, g, g, g, h, l, n, n, n, n, o, o, p, p, s, t, t, t, u, y]
  35. System.out.println("lists= "+lists);
  36. //将排序好的字符数组转换为StringBuffer
  37. StringBuffer sb=new StringBuffer();
  38. for (int i = 0; i < lists.size(); i++) {
  39. sb.append(lists.get(i));
  40. }
  41. input=sb.toString();
  42. //input= abcdeeggghlnnnnooppstttuy
  43. System.out.println("input= "+input);
  44.  
  45. /**
  46. * 第二步: 找出出现相同的字符并记录出现多少次
  47. */
  48. //最多重复出现多少次
  49. int max=0;
  50. //重复出现的字符
  51. String maxString="";
  52. /*//重复出现的字符列表
  53. ArrayList<String> maxList=new ArrayList<String>();*/
  54. //用来保存出现最多的字符串和次数
  55. HashMap<String, Integer> hm=new HashMap<String, Integer>();
  56. //将出现过的字符遍历
  57. Iterator<String> its=set.iterator();
  58. while (its.hasNext()) {
  59. String os=its.next();
  60. //字符出现在排序后input中的第一次位置
  61. int begin=input.indexOf(os);
  62. //字符出现在排序后input中的最后一次位置
  63. int end=input.lastIndexOf(os);
  64. //字符出现的次数
  65. int value=end-begin+1;
  66. if (value>=max) {
  67. max=value;
  68. maxString=os;
  69. hm.put(maxString, max);
  70. }
  71. }
  72.  
  73. for (Map.Entry<String, Integer> enties: hm.entrySet()) {
  74. if (enties.getValue()==max) {
  75. System.out.print("重复最多的字母是:"+enties.getKey());
  76. System.out.println("重复最多的次数是:"+enties.getValue());
  77. }
  78. }
  79. }
  80. }

运行结果如下:
  1. set= [a, b, c, d, e, g, h, l, n, o, p, s, t, u, y]
  2. lists= [a, b, c, d, e, e, g, g, g, h, l, n, n, n, n, o, o, p, p, s, t, t, t, u, y]
  3. input= abcdeeggghlnnnnooppstttuy
  4. 重复最多的字母是:n重复最多的次数是:4

当有字符串重复的次数相同时,也可以将它们都打印出来。
  1. public static void main(String[] args) {
  2. String input = "abbcccddddeeeeeffffffaaaaabbb";
  3. new SortTest().doString(input);
  4. }

运行结果如下:

  1. set= [a, b, c, d, e, f]
  2. lists= [a, a, a, a, a, a, b, b, b, b, b, c, c, c, d, d, d, d, e, e, e, e, e, f, f, f, f, f, f]
  3. input= aaaaaabbbbbcccddddeeeeeffffff
  4. 重复最多的字母是:f重复最多的次数是:6
  5. 重复最多的字母是:a重复最多的次数是:6

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================

我的Java开发学习之旅------>求字符串中出现次数最多的字符串以及出现的次数的更多相关文章

  1. 我的Java开发学习之旅------>求N内所有的素数

    一.素数的概念 质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除,换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数 ...

  2. 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法

    本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...

  3. 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式

    在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...

  4. 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文

    今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...

  5. 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值

    ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...

  6. 我的Java开发学习之旅------>二进制、八进制、十进制、十六进制之间转换

    一. 十进制与二进制之间的转换  (1) 十进制转换为二进制,分为整数部分和小数部分  ① 整数部分  方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权 ...

  7. 我的Java开发学习之旅------&gt;Base64的编码思想以及Java实现

    Base64是一种用64个字符来表示随意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,由于二进制文件包括非常多无法显示和打印的字符.所以,假设要让记事本这种 ...

  8. 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理

    一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...

  9. 我的Java开发学习之旅------>Base64的编码思想以及Java实现

    Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...

随机推荐

  1. ASIHTTPRequest 问题总结

    1, ASIHttpRequest与30秒超时 今天在项目中发现一个ASIHttpRequest的Bug.这个Bug可能会导致你Http请求延时至少在timeout设置时间结束之后.更可怕的是,为了找 ...

  2. 给力Mac下的思维整理软件,思维导图软件合辑

    给力Mac下的思维整理软件,思维导图软件合辑 1.Mindjet MindManager for mac 10.0.211 经典的头脑风暴思维导图软件 最新破解Mindjet MindManager ...

  3. Context都没弄明白,还怎么做Android开发?

    Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...

  4. 前端模板adminlte

    adminlet是一个前端模板,包含各种各样的功能,自己的网站可以根据需要进行修改:可以免费使用,也有收费增强版,界面如下: 参考: 1.https://adminlte.io/ 2.https:// ...

  5. 探秘 flex 上下文中神奇的自动 margin

    为了引出本文的主题,先看看这个问题,最快水平垂直居中一个元素的方法是什么? 水平垂直居中也算是 CSS 领域最为常见的一个问题了,不同场景下的方法也各不相同,各有优劣.嗯,下面这种应该算是最便捷的了: ...

  6. ofstream的使用方法

    ofstream的使用方法ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;  在C 中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包 ...

  7. PHP之面向对象学习

    1.类 Class lio{ Public Protect Private Function __constructor(){} } 2.类的实例化 <? php class lio{ //定义 ...

  8. UNP学习笔记(第六章 I/O复用)

    I/O模型 首先我们将查看UNIX下可用的5种I/O模型的基本区别: 1.阻塞式I/O 2.非阻塞式I/O 3.I/O复用(select和poll) 4.信号驱动式I/O(SIGIO) 5.异步I/O ...

  9. base64编码-----------》struts2(token)利用BigInteger产生随机数

    //struts2 源码 public static final Random RANDOM= new Random(); public static String generateGUID(){ r ...

  10. svn:冲突(<<<<<<.mine ==== >>>>>>.xxxx)

    http://blog.csdn.net/u014000377/article/details/50605895 在svn更新文件时会产生有冲突的文件,一般有两种解决办法: 1.更新文件之前直接查看对 ...