下記の要件を満たす関数removeNb($n)
を作っています。
- 引数nは0より大きい数値
- 1, 2, 3, …, nの中に含まれるいずれか2つの数字をaとbとする。aとbは「1+2+3+...+n-a-b=a*b」を満たす。
- この関数は最後に、条件を満たすaとbのすべてのペアを配列で返す。[[a1, b1], [a2, b2], ...]というように。a1<a2<...という順番になるように並べる。
- aとbのペアがなければ空の配列を返す。
なお、引数と返り値のペアの例をあげます。
- removeNb(100) -> []
- removeNb(101) -> [[55, 91], [91, 55]]
- removeNb(102) -> [[70, 73], [73, 70]]
僕は次のようなコードを書きました。
php
1function removeNb($n) { 2 $ans = []; 3 $arr = range(1, $n); 4 $sum = array_sum($arr); 5 foreach($arr as $key => $val) { 6 for($i = $n - 1; $i >= $val; $i--) { 7 if($arr[$i] === $val) {continue;} 8 if($sum - $val - $arr[$i] === $val * $arr[$i]) { 9 $ans = array_merge($ans, array([$val, $arr[$i]])); 10 break; 11 } 12 } 13 } 14 15 if(empty($ans)) return $ans; 16 17 $revans = array_reverse($ans); 18 for($j = 0; $j < count($revans); $j++) {$revans[$j] = array_reverse($revans[$j]);} 19 return array_merge($ans, $revans); 20}
しかし、このコードだと、処理に時間がかかってしまうみたいです。処理が素早く完了するようにコードを改善したいです。ご教授ください。
<追記>
https://www.codewars.com/kata/is-my-friend-cheating/train/php
この問題を解いていました。コードを書いて「ATTEMPT」を押したら、そのコードでお題がクリアできるかどうかが検証されます。処理に時間がかかると処理が中断されてしまいます。僕のコードでも、cerfwebさんのコードでも、処理が途中で中断されてしまいました。「かかってしまうみたい」と表現しているのはこのためです。
回答3件
あなたの回答
tips
プレビュー