行业资讯 2025年08月6日
0 收藏 0 点赞 405 浏览 1973 个字
摘要 :

文章目录 1. 使用纯Java 1.1. 算法 1.2. Java程序 2.使用Google Guava 学习编写一个简单的 Java 程序来查找 String 中的重复字符。这可能是一个可能的Java 面试问题……




  • 1. 使用纯Java
    • 1.1. 算法
    • 1.2. Java程序
  • 2.使用Google Guava

学习编写一个简单的 Java 程序来查找 String 中的重复字符。这可能是一个可能的Java 面试问题,而面试官可能会评估我们的编码技能。

我们可以使用给定的代码来查找重复的字符,或者修改代码来查找字符串中的非重复字符

1. 使用纯Java

让我们从自己编写程序逻辑开始。在此解决方案中,我们创建Map,其中字符串中的每个唯一字符都是Map键,并且字符出现的次数存储为值。

1.1. 算法

  • 将字符串拆分为字符数组。
  • 迭代字符数组。
  • 对于每次迭代,使用该字符作为Map的key并检查Map中是否已存在相同的字符。
  • 如果Map的key不存在,则该字符是第一次出现,将其存储在map中,计数value为1。
  • 如果Map的key存在,则增加关联的计数器。
  • 重复此操作,直到迭代完数组中的所有字符。
  • 检查Map,重复字符的计数大于1。
  • 不重复字符的计数为 1。

1.2. Java程序

public static Map<Character, Integer> getCharBag(String input) {

  Map<Character, Integer> map = new HashMap<>();
  
  if(input == null || input.length() == 0)
    return map;
  
  for (char c : input.toCharArray()) {

    if (map.containsKey(c)) {
      int counter = map.get(c);
      map.put(c, ++counter);
    } else {
      map.put(c, 1);
    }
  }
  return map;
}

现在我们可以使用上面的Map来了解每个字符的出现次数并确定哪些字符是重复的或唯一的。

//duplicate chars
List duplicateChars = bag.keySet()
    .stream()
    .filter(k -> bag.get(k) > 1)
    .collect(Collectors.toList());

System.out.println(duplicateChars); //[a, o]

我们还可以找到该字符串中的重复字符及其出现次数。

Map<Character, Integer> duplicateCharsWithCount = bag.entrySet()
    .stream()
    .filter(e -> bag.get(e.getKey()) > 1)
    .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));

System.out.println(duplicateCharsWithCount); //{a=2, o=3}

同样,我们可以通过将计数与 1 进行比较来获取所有唯一字符。

//unique chars
List duplicateChars = bag.keySet()
    .stream()
    .filter(k -> bag.get(k) == 1)
    .collect(Collectors.toList());

System.out.println(duplicateChars); //[t, d, v, w, h, i, j, n]

2.使用Google Guava

寻找重复字符的方法与前一节讨论的相同。我们只需将HashMap类替换为Google Guava库中的Multiset类。

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>31.1-jre</version>
</dependency>

我们需要将所有字符一一添加到Multiset中。Multiset类允许通过跟踪它包含的每个唯一元素的计数来存储同一元素的多次出现。

Multiset multiset = HashMultiset.create();
for (char c : input.toCharArray()) {
  multiset.add(c);
}

从这一点来看,我们可以使用Multiset来使用上一节中的类似逻辑来查找不同且唯一的字符。

Map<Character, Integer> duplicateCharsWithCount = (Map<Character, Integer>) multiset.elementSet()
  .stream()
  .filter(k -> multiset.count(k) > 1)
  .collect(Collectors.toMap(p -> p, p -> multiset.count(p)));
System.out.println(duplicateCharsWithCount); //{a=2, o=3}

我们学习了如何使用映射来查找字符串中的重复字符,并检查非重复字符。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9194.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号