基于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,查找,打印,字符串
0
投稿

猜你喜欢

  • java实现科研信息管理系统

    2022-05-13 02:49:41
  • 浅谈Java生命周期管理机制

    2022-02-21 19:07:47
  • Spring @Bean注解的使用场景与案例实现

    2023-11-20 04:44:22
  • 深入探究如何使用Java编写MapReduce程序

    2022-10-17 18:40:04
  • 一看就懂的Android APP开发入门教程

    2023-07-18 04:10:41
  • Java的类型擦除式泛型详解

    2022-01-02 11:59:00
  • Java Base64解码错误及解决方法

    2023-02-09 03:36:35
  • Java的Hibernate框架结合MySQL的入门学习教程

    2021-10-18 04:48:20
  • 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
  • SpringBoot整合Apollo配置中心快速使用详解

    2022-12-25 17:00:34
  • 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
  • Java SpringBoot实现带界面的代码生成器详解

    2023-09-28 11:54:14
  • 浅谈Java并发中的内存模型

    2022-09-07 17:54:47
  • asp之家 软件编程 m.aspxhome.com