一般に、String
の文字を処理する場合は、を入力しないでください。 gを部分文字列に変換します。 String
を含むCharSequence
はすべて、IntStream
としてすべての文字を処理することを可能にする方法chars()
およびを持つことに注意してください。
'0'
から'9'
までのすべての数字が存在しているかどうかを確認するために、我々はchars()
を使用することができます(サロゲートペアを考える必要はありません)とストレートフォワードそれを行う、'0'
を減算することによって彼らの実際の数にマップ、フィルタリングすべての非数字を(ちょうど)確認してから、nビットが設定されているint
にマッピングしてください。バイナリまたはをすべて一緒にチェックして、
public static boolean hasAllDigits(String s) {
return s.length()>9 &&
s.chars().map(c -> c-'0').filter(c -> c>=0 && c<=9)
.map(c -> 1 << c).reduce(0, (a,b)->a|b) == 0b1111111111;
}
ボーナスとして、 ckの先頭にはString
が10文字以上含まれていなければならないため、10文字すべてが含まれていなければなりません。
今実際の作業についてはわかりません。
long number=123;
for(long l = 1, end = Long.MAX_VALUE/number; l < end; l++) {
long candidate = number * l;
if(hasAllDigits(String.valueOf(candidate))) {
System.out.println("found: "+candidate);
return;
}
}
System.out.println("not found within the long range");
しかし、あなたはあなたが数字のシーケンス内のすべての桁に遭遇したときに知りたい場合は、我々はテストを適応する必要があります:あなただけのすべての桁を持つ数に遭遇するまで反復処理したい場合、それは非常に簡単です法と反復間のビットセット保つ:
public static int getDigits(String s) {
return s.chars().map(c -> c-'0').filter(c -> c>=0 && c<=9)
.map(c -> 1 << c).reduce(0, (a,b)->a|b);
}
long number=123;
int digits=0;
for(long l = 1, end = Long.MAX_VALUE/number; l < end; l++) {
long candidate=number * l;
int newDigits=digits | getDigits(String.valueOf(candidate));
if(newDigits != digits) {
System.out.printf("pos %10d: %10d%n", l, candidate);
digits=newDigits;
if(digits == 0b1111111111) {
System.out.println("encountered all digits");
break;
}
}
}
if(digits != 0b1111111111) {
System.out.println("did not encounter all digits within the long range");
}
この方法のみとなります印刷麻痺をこれまでに遭遇したことのない少なくとも1桁の数字を持つシーケンスのうち、どれが完全なセットに寄与しているかを簡単に見ることができ、最大10個のシーケンスを見ることができます。
あなたは 'Set'にそれらを挿入し、' Set'のサイズが10であるかどうかを確認することができます – SomeJavaGuy