繰り返されたユーザー入力文字からチェックする方法を理解するのに問題があります。プログラムは、繰り返される文字を真として出力し、存在しない場合は偽として出力する必要があります。プログラムは、数字や記号の繰り返しを数えるべきではありません。
例えば:
ユーザー入力: チョコレート
プログラム出力: Trueユーザー入力: 112 クリーム
プログラム出力: False
繰り返されたユーザー入力文字からチェックする方法を理解するのに問題があります。プログラムは、繰り返される文字を真として出力し、存在しない場合は偽として出力する必要があります。プログラムは、数字や記号の繰り返しを数えるべきではありません。
例えば:
ユーザー入力: チョコレート
プログラム出力: True
ユーザー入力: 112 クリーム
プログラム出力: False
これは、@rell からの回答に基づく別のバージョンですが、noHashSet
またはchar[]
creation はありません。
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)
O(n)
O(n)
O(n^2)
O(n)
indexOf
O(n)
abcdefghijklmnopqrstuvwxyzz
ストリームを使用して別のバージョンを更新します。
private static boolean check(String input) {
IntStream characters = input.codePoints().filter(Character::isLetter);
return characters
.distinct()
.count() == characters.count();
}
更新ストリーム版のバグ修正
これでシングルループに減らすことができます。
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;
}
これを試して :
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
1.) 文字配列をソートします。
2.) 配列を繰り返し処理して、i 番目の値 == (i+1) 番目の値かどうかを確認します。見つかった場合は、false を返します。それ以外の場合は、true を返します。
時間計算量: O(nlogn) (ソート用)
スペースの複雑さ: O(1)