970-強整数
前言
Weekly Contest 118の強い整数:
2つの非負の整数
任意の順序で答えを返すことができます.あなたの回答では、値ごとに最大1回表示されます.
例1:
例2:
ヒント:
問題を解く構想.
本題は正の整数の中で
注意事項:サイクル中に重複する値が発生し、例えば .がタイムアウトを実行する場合、例えば
インプリメンテーションコード
Weekly Contest 118の強い整数:
2つの非負の整数
x
およびy
が与えられ、ある整数がx^i
+y^j
に等しく、整数i >= 0
およびj >= 0
である場合、整数は強い整数であると考えられる.bound
以下の値を持つすべての強い整数のリストを返します.任意の順序で答えを返すことができます.あなたの回答では、値ごとに最大1回表示されます.
例1:
:x = 2, y = 3, bound = 10
:[2,3,4,5,7,9,10]
:
2 = 2^0 + 3^0
3 = 2^1 + 3^0
4 = 2^0 + 3^1
5 = 2^1 + 3^1
7 = 2^2 + 3^1
9 = 2^3 + 3^0
10 = 2^0 + 3^2
例2:
:x = 3, y = 5, bound = 15
:[2,4,6,8,10,14]
ヒント:
1 <= x <= 100
1 <= y <= 100
0 <= bound <= 10^6
問題を解く構想.
本題は正の整数の中で
x^i
+y^j
かつ<=bound
を満たす数を見つければよいので,二重for
サイクルで条件を満たす数を見つければよい.注意事項:
:x = 2, y = 3, bound = 10
:[2,3,4,5,7,9,10]
:
2 = 2^0 + 3^0
3 = 2^1 + 3^0
4 = 2^0 + 3^1
5 = 2^1 + 3^1
5 = 2^2 + 3^0
7 = 2^2 + 3^1
9 = 2^3 + 3^0
10 = 2^0 + 3^2
サイクル中に重複する場合が5 = 2^1 + 3^1
5 = 2^2 + 3^0
である場合、先にSetを使用して結果の重さを除去することができる :x = 1, y = 3, bound = 100
.したがって、bound
ではなく、x^bound>bound
(Integer.MAX_VALUE
が一定である)のサイクル数を選択することができる.インプリメンテーションコード
/**
* 970.
* @param x
* @param y
* @param bound
* @return
*/
public List powerfulIntegers(int x, int y, int bound) {
// Set
Set set = new HashSet<>();
// bound, Integer.MAX_VALUE,
for (int i = 0; i < bound; i++) {
int tmp1 = (int) Math.pow(x, i);
// bound, ,
if (tmp1 > bound) {
break;
}
// bound, Integer.MAX_VALUE,
for (int j = 0; j < bound; j++) {
int tmp2 = (int) (Math.pow(y, j));
int tmp = tmp1 + tmp2;
// bound
if (tmp <= bound) {
set.add(tmp);
} else {// bound , bound
break;
}
}
}