LoginSignup
2
1

More than 5 years have passed since last update.

phpで問題を解いてみた

Posted at

問題

用意された配列の値のうち、1つにプラス1して、すべての値と乗算した場合
どの値にプラス1するのがもっとも大きい結果になるか

0)
numbers = {1, 2, 3}
Returns : 12

1)
numbers = {1, 3, 2, 1, 1, 3}
Returns : 36
※数字は必ずしもユニークではない

2)
numbers = {1000, 999, 998, 997, 996, 995}
Returns : 986074810223904000

答えは非常に大きい数字になりますが、2の62乗を超えません

3)
numbers = {1, 1, 1, 1}
Returns : 36

自分なりの回答

<?php
$numbers = array(1,1,1,1);
$target1 = 0;
for ($y = 0; $y < count($numbers); $y++){
  $target2 = 1;
  $numbers[$y] = $numbers[$y] + 1;
  for ($i = 0; $i < count($numbers); $i++) {
      $target2  = $target2 * $numbers[$i];
  }
  $numbers[$y] = $numbers[$y] - 1;
  if($target1 < $target2){
      $target1 = $target2;
  }
}
echo $target1;
?>

これだと2重にループするので配列に1000個値が入ってきたときにとんでもない数ループする
そしてメソッド化していないため、テストするさいに、配列の中身を書き換える必要があるため
ソースを書き換えることになってよろしくない

他の方の回答


<?php
function check($arr) {
    asort($arr);
    $arr[0] += 1;
    return array_reduce($arr, function ($carry, $item)
    {
        $carry *= $item;
        return $carry;
    }, 1);
}

var_dump(check(array(1,2,3)));
?>

私の回答と違い、メソッド化してあるのでテストのさいにもコードを書き換えずテスト化
array_reduceを使用することによって、ループの数を私の回答から比べて半分に減らしている。

まとめ

短いですがまとめると
私の回答はゴリ押しで誰でも思いつくような回答ですが、phpにはarray_reduceやarray_filter等便利な配列用の関数がいろいろあるので
どういう関数があるのか見ておいたほうが、私のような恥ずかしいコードを書かなくて済みますな。

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1