我在弄清楚如何检查用户输入的重复字母时遇到了问题。程序需要将重复的字母输出为真,如果没有则输出为假。程序不应计算重复的数字或符号。
例如:
用户输入:巧克力
程序输出:真用户输入:112 cream
程序输出:False
我在弄清楚如何检查用户输入的重复字母时遇到了问题。程序需要将重复的字母输出为真,如果没有则输出为假。程序不应计算重复的数字或符号。
例如:
用户输入:巧克力
程序输出:真
用户输入:112 cream
程序输出:False
这是另一个版本,基于@rell 的回答,但没有HashSet
或没有char[]
创建。
private static boolean check(String input) {
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isLetter(ch) && input.indexOf(ch, i + 1) != -1) {
return true;
}
}
return false;
}
对于较小的输入字符串,这很可能会更快。但是对于更长的输入字符串,来自@rell 的版本可能会更快,因为他使用的是HashSet
带有O(1)
查找/插入的 a,并且由于循环是O(n)
总数是O(n)
. 我的解决方案是O(n^2)
(循环O(n)
乘以 with indexOf
)O(n)
,最坏的情况输入将是这样的abcdefghijklmnopqrstuvwxyzz
。
使用流更新另一个版本。
private static boolean check(String input) {
IntStream characters = input.codePoints().filter(Character::isLetter);
return characters
.distinct()
.count() == characters.count();
}
更新修复了流版本中的错误
private static boolean check(String input) {
Set<Character> tmp = new HashSet<Character>();
for(char ch : input.toCharArray()) {
if (Character.isLetter(ch) && !tmp.add(ch)) {
return true;
}
}
return false;
}
尝试这个 :
String username ;
char[] x = username.toCharArray();
boolean duplicates=false;
for (j=0;j<x.length;j++)
for (k=j+1;k<x.length;k++)
if (x[k] == x[j])
duplicates=true
为了检查任何字母的重复次数是否超过限制次数,您可以使用以下方法:
public static boolean repeatedMoreThanLimitedLength(String str, int limitLength) {
Pattern pattern = Pattern.compile("(\\w)\\1+");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
if (matcher.group().length() >= limitLength)
return true;
}
return false;
}
1.) 对字符数组进行排序。
2.) 遍历数组以查看第 i 个值是否 == (i+1) 个值。如果找到,则返回 false。否则,返回真。
时间复杂度:O(nlogn)(用于排序)
空间复杂度:O(1)
我们可以用这个减少到单循环。
boolean checkDuplicates(char[] x)
{
Set<char> xSet = new HashSet<char>();
for (char c : x)
{
if (xSet.contains(c)) return true;
xSet.add(i);
}
return false;
}