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

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

金山公司面试题:一个字符串中可能包含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

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


相关文章
|
10天前
|
Java
Java 字符串分割split空字符串丢失解决方案
Java 字符串分割split空字符串丢失解决方案
|
10天前
|
消息中间件 前端开发 Java
java学习路径
【4月更文挑战第9天】java学习路径
17 1
|
15天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
10天前
|
设计模式 前端开发 安全
Java是一种广泛使用的编程语言,其学习路径可以大致分为以下几个阶段
【4月更文挑战第9天】Java是一种广泛使用的编程语言,其学习路径可以大致分为以下几个阶段
15 1
|
1天前
|
JavaScript Java 测试技术
基于Java的精品课程在线学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的精品课程在线学习系统的设计与实现(源码+lw+部署文档+讲解等)
15 1
|
1天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
1天前
|
JavaScript Java 测试技术
基于Java的中文学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的中文学习系统的设计与实现(源码+lw+部署文档+讲解等)
14 0
|
1天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
27 10
|
1天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
7天前
|
Java 存储
键值之道:深入学习Java中强大的HashMap(二)
键值之道:深入学习Java中强大的HashMap
10 0
键值之道:深入学习Java中强大的HashMap(二)