基于java查找并打印输出字符串中字符出现次数
作者:cqy19951026 时间:2022-07-28 19:45:47
今天在面试时遇到一道算法的题:
给定一个字符串,输出每次字符出现的次数;要求按照顺序输出;
自己的思路开始是:
1.把String转换char数组
2.直接去遍历数组,获取每个字符出现次数,遇到不同时候重新记录
3.把结果用StringBuffer拼接后输出
public class Record {
public static void main(String[] args) {
System.out.println("直接遍历数组的方法:"+compressStrArray("aaacccddeffgghhhhaa"));
}
//直接遍历数组拼接,获得对字符记录结果是有序的,但是会出现重复字符的情况,在去修改重复字符逻辑也比较麻烦
public static String compressStrArray(String srcStr) {
char[] chars = srcStr.toCharArray();
char c = chars[0];
int i = 0;
int a = 0;
StringBuffer buffer = new StringBuffer();
for (char aChar : chars) {
a++;
if (aChar != c) {
buffer.append(i).append(c+" ");
c = aChar;
i=1;
}else {
i++;
}
if (a >= chars.length) {
buffer.append(i).append(c+" ");
}
}
return buffer.toString();
}
}
得到的结果是:3a 3c 2d 1e 2f 2g 4h 2a
结果虽然是有序的,但会出现重复字符记录的情况,修改起来比较麻烦,于是暂时放下了,如果不考虑重复只考虑有序的话可以使用这种方法
后来在晚上跑步的时候想到了可以使用map容器,一开始使用了HashMap
public class Record {
public static void main(String[] args) {
System.out.println("使用Linkedhashmap容器的方法:"+compressStrArrayLinkedHashMap("cccddeffgghhhhaaa"));
}
//先吧字母存在hashmap容器中,在从hashmap中拿出来拼接,顺序是计算hashcode后的顺序,不是放入字符的顺序
public static String compressStrArrayHashMap(String srcStr) {
HashMap<Character, Integer> map = new HashMap<>();
char[] chars = srcStr.toCharArray();
for (char aChar : chars) {
if (map.get(aChar)!=null) {
map.put(aChar,map.get(aChar)+1 );
}else {
map.put(aChar,1 );
}
}
StringBuffer buffer = new StringBuffer();
for (Character character : map.keySet()) {
if (map.get(character)!=1) {
buffer.append(map.get(character)).append(character+" ");
}else {
buffer.append(character+" ");
}
}
return buffer.toString();
}
}
调整了一下字符,发现得到的结果是:3a 3c 2d e 2f 2g 4h
记录的顺序是计算hashcode后的顺序,不是放入字符的顺序,但是去掉了重复字符,如果单纯记录次数可以使用hashmap
最后在看api文档时候发现了还有一个LinkedHashMap可以保证放入对象的顺序,于是有将hashmap改为linkedhashmap
public class Record {
public static void main(String[] args) {
System.out.println("使用Linkedhashmap容器的方法:"+compressStrArrayLinkedHashMap("cccddeffgghhhhaaa"));
}
public static String compressStrArrayLinkedHashMap(String srcStr) {
LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
char[] chars = srcStr.toCharArray();
for (char aChar : chars) {
if (map.get(aChar)!=null) {
map.put(aChar,map.get(aChar)+1 );
}else {
map.put(aChar,1 );
}
}
StringBuffer buffer = new StringBuffer();
for (Character character : map.keySet()) {
if (map.get(character)!=1) {
buffer.append(map.get(character)).append(character+" ");
}else {
buffer.append(character+" ");
}
}
return buffer.toString();
}
}
最后得到结果是:3c 2d e 2f 2g 4h 3a
顺序是放入字符的顺序,也没有了重复,如果要保证有序不重复的记录应该使用LinkedHashMap来作为记录容器
来源:https://www.cnblogs.com/cqy1026/p/13899807.html
标签:java,查找,打印,字符串
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java实现科研信息管理系统
2022-05-13 02:49:41
![](https://img.aspxhome.com/file/2023/9/67009_0s.jpg)
浅谈Java生命周期管理机制
2022-02-21 19:07:47
Spring @Bean注解的使用场景与案例实现
2023-11-20 04:44:22
深入探究如何使用Java编写MapReduce程序
2022-10-17 18:40:04
![](https://img.aspxhome.com/file/2023/7/66047_0s.webp)
一看就懂的Android APP开发入门教程
2023-07-18 04:10:41
![](https://img.aspxhome.com/file/2023/5/82405_0s.jpg)
Java的类型擦除式泛型详解
2022-01-02 11:59:00
![](https://img.aspxhome.com/file/2023/8/61608_0s.jpg)
Java Base64解码错误及解决方法
2023-02-09 03:36:35
![](https://img.aspxhome.com/file/2023/5/66515_0s.jpg)
Java的Hibernate框架结合MySQL的入门学习教程
2021-10-18 04:48:20
![](https://img.aspxhome.com/file/2023/7/67007_0s.png)
Java webservice的POST和GET请求调用方式
2023-01-10 05:35:43
了解Java线程池创建过程
2022-09-29 20:45:49
为什么rest接口返回json建议采用下划线形式,不要用驼峰
2023-06-24 23:23:16
Java Thread.currentThread().getName() 和 this.getName()区别详解
2021-10-31 01:46:18
![](https://img.aspxhome.com/file/2023/4/61834_0s.png)
SpringBoot整合Apollo配置中心快速使用详解
2022-12-25 17:00:34
![](https://img.aspxhome.com/file/2023/7/61337_0s.jpg)
SpringBoot如何通过Feign调用传递Header中参数
2023-11-24 21:39:29
详解Java代码常见优化方案
2023-11-29 03:13:04
Spring Security和Shiro的相同点与不同点整理
2023-01-15 17:07:20
Flutter 队列任务的实现
2023-07-07 17:25:14
Git工具 conflict冲突问题解决方案
2023-07-27 10:27:30
![](https://img.aspxhome.com/file/2023/1/57911_0s.png)
Java SpringBoot实现带界面的代码生成器详解
2023-09-28 11:54:14
![](https://img.aspxhome.com/file/2023/0/63000_0s.png)
浅谈Java并发中的内存模型
2022-09-07 17:54:47
![](https://img.aspxhome.com/file/2023/3/62093_0s.png)