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

此题的解题思路如下:

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

代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeSet; public class SortTest {
public static void main(String[] args) {
String input = "httpblogcsdnnetouyangpeng";
new SortTest().doString(input);
} public void doString(String input) {
/**
* 第一步:
* 使用TreeSet快速找到所有出现的字符串
* 将输入的字符串按升序排列
*/
//将String转换为字符数组
char[] chars=input.toCharArray();
ArrayList<String> lists=new ArrayList<String>();
//TreeSet是一个有序集合,TreeSet中的元素将按照升序排列
//通过TreeSet的不重复性,快速找到所有出现的字符串
TreeSet<String> set=new TreeSet<String>();
for (int i = 0; i < chars.length; i++) {
lists.add(String.valueOf(chars[i]));
set.add(String.valueOf(chars[i]));
}
//set= [a, b, c, d, e, g, h, l, n, o, p, s, t, u, y]
System.out.println("set= "+set);
//排序
Collections.sort(lists);
//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]
System.out.println("lists= "+lists);
//将排序好的字符数组转换为StringBuffer
StringBuffer sb=new StringBuffer();
for (int i = 0; i < lists.size(); i++) {
sb.append(lists.get(i));
}
input=sb.toString();
//input= abcdeeggghlnnnnooppstttuy
System.out.println("input= "+input); /**
* 第二步: 找出出现相同的字符并记录出现多少次
*/
//最多重复出现多少次
int max=0;
//重复出现的字符
String maxString="";
/*//重复出现的字符列表
ArrayList<String> maxList=new ArrayList<String>();*/
//用来保存出现最多的字符串和次数
HashMap<String, Integer> hm=new HashMap<String, Integer>();
//将出现过的字符遍历
Iterator<String> its=set.iterator();
while (its.hasNext()) {
String os=its.next();
//字符出现在排序后input中的第一次位置
int begin=input.indexOf(os);
//字符出现在排序后input中的最后一次位置
int end=input.lastIndexOf(os);
//字符出现的次数
int value=end-begin+1;
if (value>=max) {
max=value;
maxString=os;
hm.put(maxString, max);
}
} for (Map.Entry<String, Integer> enties: hm.entrySet()) {
if (enties.getValue()==max) {
System.out.print("重复最多的字母是:"+enties.getKey());
System.out.println("重复最多的次数是:"+enties.getValue());
}
}
}
}

运行结果如下:
set=  [a, b, c, d, e, g, h, l, n, o, p, s, t, u, y]
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]
input= abcdeeggghlnnnnooppstttuy
重复最多的字母是:n重复最多的次数是:4

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

运行结果如下:

set=  [a, b, c, d, e, f]
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]
input= aaaaaabbbbbcccddddeeeeeffffff
重复最多的字母是:f重复最多的次数是:6
重复最多的字母是: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. Excel Sheet Column Title - LeetCode

    Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...

  2. luogu P2423 双塔

    题目描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“911”事件,Mr. F决定自己用水晶来搭建一座双塔.Mr. F有N块水晶,每块 ...

  3. ios6.0 siri语音识别

    Siri 让你能够利用语音来完成发送信息.安排会议.拨打电话等更多事务* .只需像平常一样讲话,就能让 Siri 帮你做事.你会发现 Siri 是如此易用而且能干,精彩用法越用你会发现越多. 懂你所说 ...

  4. 从Android动画到贝塞尔曲线

    基础知识: 动画通过连续播放一系列画面,给视觉造成连续变化的图画.很通俗的一种解释.也很好理解.那么我们先来一个案例看看. 动画案例:百度贴吧小熊奔跑 效果: topic.gif 代码: <?x ...

  5. EasyMvc入门教程-基本控件说明(5)小图标

    我们网页很多时候需要小图标来进行美化,EasyMvc默认提供了100多种常用小图标,您可以根据实际情况选择使用,请看下面的例子: @Html.Q().Ico().Type(EasyMvcHelper. ...

  6. TensorFlow笔记四:从生成和保存模型 -> 调用使用模型

    TensorFlow常用的示例一般都是生成模型和测试模型写在一起,每次更换测试数据都要重新训练,过于麻烦, 以下采用先生成并保存本地模型,然后后续程序调用测试. 示例一:线性回归预测 make.py ...

  7. Linux学习之十六-Linux用户管理

    Linux用户管理 Linux系统跟Windows系统一样,可以创建不同的用户,不同的用户组.在不同用户下使用系统具有相应的权限 创建一个普通用户时,会修改几个文件,拷贝一些初始文件到用户家目录中 修 ...

  8. 【魅族Pro7】——BootStrap/JQuery/Canvas/PHP/MySQL/Ajax爬坑之项目总结

    前言:这个项目是我们小组团体合作完成的学习项目,项目使用魅族GUI设计和图片素材,响应式重构Pro7官网的首页.子页.商城及购物车,并加入一些创新.我主要负责的是[画屏子页]的项目,这里作为温故知新, ...

  9. 2016.6.21 将Eclipse中项目部署到tomcat下

    新建的web项目,各种都配置好,选择run on server之后,发现运行失败,并不能访问需要的网址.而脱离eclipse,将生成的war文件直接放到tomcat的webapp下时,可以正常访问.所 ...

  10. 好工具MyEclise2016 CI下载

    地址:http://pan.baidu.com/s/1gfBw9Ab 安装后,点开crack目录,按步骤走. 下面是我安装成功的画面.