最近のインタビューで、インタビュアーは私にこう尋ねまし
write a Java program to find the least number whose square is of form 1_2_3_4_5_6_7_8_9_0. Where "_" could be any 1 digit number.
た。
実装するロジックを手伝ってくれる人はいますか?
最近のインタビューで、インタビュアーは私にこう尋ねまし
write a Java program to find the least number whose square is of form 1_2_3_4_5_6_7_8_9_0. Where "_" could be any 1 digit number.
た。
実装するロジックを手伝ってくれる人はいますか?
さて、そのフォーマットの最小数は1020304050607080900
平方根を持つもの1010101010.10...
です。そして、その形式の最大数は、1929394959697989990
平方根が約 1 です。1389026623.11
.
下限から開始し、上限まで繰り返します。正規表現または初歩的な文字列の文字マッチングを使用して、最初の文字が 1 であること、3 番目の文字が 2 であることを確認するだけです。
long
また、これにはaで十分だと思います。
編集:
これを自分のマシンで実行したところ、約2分かかりました。私は正規表現が苦手なので、原始的なスタイルにしました。
public static void main(String[] args) {
for (long l = 1010101010; l < 1389026623; l++) {
long squared = l * l;
String s = Long.toString(squared);
if (s.charAt(0) != '1') continue;
if (s.charAt(2) != '2') continue;
if (s.charAt(4) != '3') continue;
if (s.charAt(6) != '4') continue;
if (s.charAt(8) != '5') continue;
if (s.charAt(10) != '6') continue;
if (s.charAt(12) != '7') continue;
if (s.charAt(14) != '8') continue;
if (s.charAt(16) != '9') continue;
if (s.charAt(18) != '0') continue;
System.out.println(s);
}
}
結果は1929374254627488900
(これは2乗された数です)でした。したがって、ルート番号は1389019170
です。また、これはパターンに一致することがわかった唯一の数値であり、最小値だけではないことに注意してください。
単純ですが、おそらく効率的ではない解決策は、を使用し、パターンに一致するものBigInteger
が見つかるまで数値を(下から上に)繰り返すことです。n
n.multiply(n).toString()
toString()
結果の平方数を処理した後、パターンが一致するかどうかを正規表現で簡単に確認できます。
正規表現:
Matcher m = Pattern.compile(
"1[0-9]2[0-9]3[0-9]4[0-9]5[0-9]6[0-9]7[0-9]8[0-9]9[0-9]0").matcher("");
そして、次のコマンドで呼び出します。
m.reset(myString);
m.matches()
パターンに一致するmatches()
場合にのみtrueを返しますmyString
編集:
@ The111によって提案された最適化を使用してパフォーマンスを向上させても、アイデアは変わりません。繰り返して、結果がパターンと一致するかどうかを確認してください。