这是另一个有趣的编码问题或初级程序员的编程练习。你如何在一个给定的字符串中找到重复的字符和它们的数量?你可以用你选择的任何编程语言来解决这个编码问题,如Java、Python、Ruby,甚至是JavaScript。我将解释逻辑和解决方案,在上述编程语言中很容易实现,我将提供Java的代码,这是我最喜欢的编程语言。 为了解决这个问题,你需要首先检查一个字符串是否包含任何重复的字符,然后如果它包含任何重复的字母,然后找出它们在给定的输入字符串中出现的次数。
你的输出应该包含重复的字母和它们的数量。例如,如果我们把"Java "作为输入,那么它应该打印出重复的字母= a count = 2。你的程序应该是 不区分大小写的
,这意味着a和A应该被算作重复的字符。为这个程序提供单元测试可以得到奖励分数。
如何找到字符串中的重复出现的字符?[解决方案]
下面是以最简单的方式解决这个问题的步骤。
- 将字符串转换成大写或小写,以处理不区分大小写的问题,并使用toCharArray()从String中获得一个字符数组,如下所示。
char[] chars = input.toUpperCase().toCharArray();
-
遍历字符数组,用字符和它们的数量建立一个地图。
-
遍历我们内置的地图,打印所有计数大于1的字符,它们是重复字符。
-
这个解决方案的时间复杂度是O(n),即使我们使用两个循环,但它们没有嵌套。这意味着,即使字符串的长度将以指数形式增加,我们仍然只使用两个循环,而不是N^2循环。
-
这个解决方案的空间复杂度也是O(n),因为我们使用了额外的哈希表来存储字符及其计数,其大小与给定字符串的字符数成正比。
有一些房间可以改进这个解决方案,使其更快、更有效,你能发现它们吗?
寻找字符串中的重复字符及其频率的Java程序
要运行这个程序,你可以像我的例子中所示的那样接受来自命令行的输入,或者你可以在单元测试中用预定义的输入运行这个程序。
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/**
* Write a Program in Java to find duplicate characters and their count?
* You should not use a library method to solve this problem, though you
* are free to use utility and collection classes.
*
* @author Javin Paul
*/
public class DuplicateCharacterInString {
public static void main(String args[]) {
System.out.println("Please enter a String");
String input = null;
while (!"EXIT".equals(input)) {
Scanner reader = new Scanner(System.in);
// String input from the user
input = reader.nextLine();
// get character array from String after converting the case
// for case insensitive counting
char[] chars = input.toUpperCase().toCharArray();
// build map char -> count
Map duplicates = new HashMap();
for (char ch : chars) {
Integer oldCount = duplicates.get(ch);
if (oldCount == null) {
duplicates.put(ch, new Integer(1));
} else {
duplicates.put(ch, ++oldCount);
}
}
// Iterate through Map to find duplicates
Set> duplicateChars = duplicates.entrySet();
for (Map.Entry entry : duplicateChars) {
if (entry.getValue() > 1) {
System.out.printf("Duplicate Character : %s, Count %d %n",
entry.getKey(), entry.getValue());
}
}
}
}
}
Output:
Please enter a String
Java
Duplicate Character: A, Count 2
Sybase
Duplicate Character: S, Count 2
Programming
Duplicate Character: G, Count 2
Duplicate Character: R, Count 2
Duplicate Character: M, Count 2
Technology
Duplicate Character: O, Count 2
""
Duplicate Character: ", Count 2
************
Duplicate Character : *, Count 12
MyYourRame
Duplicate Character: R, Count 2
Duplicate Character: M, Count 2
Duplicate Character: Y, Count 2
EXIT
正如你所看到的,我们已经对不同类型的输入进行了测试,如空字符串、带*的字符串、包含大写和小写重复字母的字符串,以及一些包含重复字符的普通字符串。你实际上可以把它们封装在不同的单元测试案例中。
以上就是关于这个Java程序寻找String中的重复字符及其计数的全部内容。顺便说一下,这个程序在Java中有很多变体,因为有时你可能被要求只检查String是否包含任何重复的字符。有时,程序员可能被要求打印重复字母的数量和起始位置。
在其他情况下,也会被要求只打印String中第一个重复的字母。对于所有这些类型的问题,你可以使用相同的逻辑将String转换为字符数组,然后应用你的算法来检查数组是否包含任何重复的内容。
对于要求计数的问题,你可以使用Java集合框架中的任何Map类。还有一件事,我们在这里分两次显示重复的字符,你能一次完成吗?
感谢你到目前为止阅读这篇文章。如果你喜欢这个关于寻找给定字符串中的重复字符及其数量的编码问题,那么请与你的朋友和同事分享它。如果你有任何问题或反馈,那么请留言。