基于java查找并打印输出字符串中字符出现次数
作者:cqy19951026 发布时间:2022-07-28 19:45:47
标签:java,查找,打印,字符串
今天在面试时遇到一道算法的题:
给定一个字符串,输出每次字符出现的次数;要求按照顺序输出;
自己的思路开始是:
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
0
投稿
猜你喜欢
- 最近做一个需求,需求中的bean只用于生成一次json使用,所以想通过配置来动态的生成,查了一下,java还真有这个实现。java动态的生成
- 通常我们在看一些源码时,发现全是T、?,晕乎乎的:sob:。于是,把泛型掌握好十分重要!什么是泛型Java 泛型(generics)是 JD
- 简介之前在项目中遇到了一个新需求,领导让我使用本地缓存,来缓存数据库查出的用户信息,经过一番资料查阅和实验,最终确定了使用Caffeine来
- 在application.properties中配置了static的默认路径我的static目录结构是这样的index.html中这样引用c
- 前言 之前unity5.x在代码中写了debug.log..等等,打
- 1、静态代码块①、格式在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块:public class Code
- 本文实例讲述了Java Socket实现单线程通信的方法。分享给大家供大家参考,具体如下:现在做Java直接使用Socket的情况是越来越少
- 引言我已经一个多星期没碰过电脑了,今日上班,打开电脑的第一件事就是想着写点什么。反正大家都还沉浸在节后的喜悦中,还没进入工作状态,与其浪费时
- 一. String类简介1. 介绍字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来
- 前言Stream是一个来自数据源的元素队列并支持聚合操作,其中具有以下特性:Stream只负责计算,不存储任何元素,元素是特定类型的对象,形
- 近日于LeetCode看题遇1114 按序打印,获悉一解法使用了Semaphore,顺势研究,记心得于此。此解视Semaphore为锁,以保
- 一、介绍在实际的软件项目开发过程中,我可以很负责任的跟大家说,如果你真的实际写代码的时间超过5年,你对增删改查这类简单的功能需求开发,可以说
- 我们首先看下BASEJDBC的写法实例:package com.dao;import java.sql.Connection;import
- 一、抽象类1.抽象类1.1抽象类的定义在Java面向对象当中,所有的对象都是用过类进行描绘的,但是并不是所有的类都是用来描绘对象的,如果一个
- java 打造阻塞式线程池的实例详解原来以为tiger已经自带了这种线程池,就是在任务数量超出时能够阻塞住投放任务的线程,主要想用在JMS消
- 概述还没玩过Spring Boot,现在越来越多的公司在用了,不得不学习了。本篇是Spring Boot的开篇,简单介绍一下如何创建一个Sp
- @Autowired注解和静态方法及new关系一、@autowired 与new new出来的对象无法调用@Autowired注入
- 多说无益,贴代码:/** * 校验银行卡卡号 * * @param cardId &nbs
- 一.创建Spring boot项目,添加如下依赖<dependency> <gro
- 一、银行存取款1.前言毕竟谁不喜欢钱呢!(不是😅)我看谁不喜欢在知识的海洋中遨游😤!2.描述银行存取款的流程是人们非常熟悉的事情,用户可以在