PHPの古典的なアルゴリズムの顔の質問

最近、いくつかの古典的なアルゴリズムPHPのタイトル、部分的根拠をコンパイルした数日は、私を修正してください。

  1. 円形に配置されたサルの群、プレス1,2、...、nは番号が付けられています。その後、Mの最初の数字、番号から1を開始するだけで、それは、このように最後まで繰り返し行う、...とだけでキックm個に、それの後ろから始まり、次いで数、円を蹴っこれまでのところ唯一の猿は、猿は王と呼ばれています。このプロセスは、シミュレーションプログラム、入力M、N、最後の王の数の出力を必要とします。

思考

サルは、最後に配列に未設定またはアウトの要件を満たすために、再帰ループを配列を命じました。

function circle($n,$m)
{
    $list = []; 
    for($i = 1; $i <= $n; $i++)
    {
        $list[$i] = $i;
    }

    $array = kick($list, $m);

    return implode($array);
}

function kick($array,$m)
{
    if(count($array) == 1)
    {
        return $array;
    }

    foreach($array as $key => $value)
   {
       if($key%$m == 0) 
       {
           unset($array[$key]);
       }
       else
       {
           array_push($array,$array[$key]);
           unset($array[$key]);
       }
   }

    $array = kick($array, $m);

    return $array;

}

//  7
echo circle(8,3);
  1. 牛があり、4歳、1年を出産することができ、同じ牛から生まれている、15歳の去勢、もはや学生、20歳の死は、後で牛のn年の何頭を尋ねました。

思考

それは20歳のマイナス1(死体)に達した場合、総数は20歳以上のうち、(子牛の誕生)をインクリメントして4の倍数であると同時に、15歳未満ならば、統計の総数は、毎年を通じて、単一の牛を、設定しますループ(それは合計金額は変更されません)。誕生数年前、あなたはその出力の合計との死を計算することができるようにどのように多くの牛、静的変数としての両方が累積計算結果を合計 - この質問の本質は、すべての出産子牛が、年のその合計数に=年間の総数はということです。

function cow($year)
{
    static $sum = 1;

    for($i = 1; $i <= $year; $i++)
    {
        if($i > 20)
        {
            break;
        }
        if($i <15 && $i%4 == 0)
        {
            $sum++;
            cow($year - $i);
        }
        if($i == 20)
        {
            $sum --;
        }
    }

    return $sum;
}

echo cow(100);
  1. パスカルの三角形

ここに画像を挿入説明
思考

両側に1、番号= 2の数に相互に対応する行と

function triangle($n)
{
    $base = ['1'=>[1],'2'=>[1,1],'3'=>[1,2,1]];

    if($n <= 3)
    {
        return $base;
    }

    for($i =4; $i <= $n; $i ++)
    {
        $temp = [1];
        for($j = 0; $j < count($base[$i - 1]) - 1; $j ++)
        {
            $temp[] = $base[$i - 1][$j] + $base[$i - 1][$j+1];
        }
        $temp[] = 1;
        $base[$i] = $temp;
    }

    return $base;
}

var_dump(triangle(10));
  1. バブルソート

思考

順番に各番号とトラバースした後に、最大数は最後のものになるよう、小の前に置くために数、最後から二番目の場所への第2のパスの先頭の後ろから最初の数を比較します前後。

function maopao($data)
{
    $len = count($data);

    for($i = $len; $i > 1; $i --)
    {
        for($j = 0; $j < $i - 1; $j ++)
        {
            if($data[$j] > $data[$j + 1])
            {
                $temp = $data[$j + 1];
                $data[$j + 1] = $data[$j];
                $data[$j] = $temp;
            }
        }
    }

    return $data;
}

var_dump(maopao([5,1,8,3,6,4,9,2,7]));
  1. クイックソート

思考

アレイを介して、最初の採取、アレイは、上記ので、場合のみ、そのツリー構造を形成するために、右またはアレイにそれを大きくし、左右それぞれ再帰ソートされたアレイの左に少ないそれよりもノードがいた良い組み合わせを並べ替えられています。
このアルゴリズムは、最適な時間の複雑さはO(n)のバブルは、状況のほとんどのよう、速い、遅いことよりも、O(log2n)です。

function quick($data)
{
    if(count($data) <= 1)
    {
        return $data;
    }

    $key = $data[0];
    $left = [];
    $right = [];

    for($i = 1; $i < count($data); $i ++)
    {
        if($data[$i] < $key)
        {
            $left[] = $data[$i];
        }
        else
        {
            $right[] = $data[$i];
        }
    }

    $left = quick($left);
    $right = quick($right);

    return array_merge($left,array($key),$right);
}

var_dump(quick([5,1,8,3,6,4,9,2,7]));
  1. バイナリサーチシーケンスインデックスの配列を返します

思考

それぞれがいくつかの中間のコントラストを取り、左とは対照的に大きな数は、小さく、右の比較に、私は配列は、実際には、より多くのメモリ保存コントラストの添字を交換し、左右の下の標準を使用して傍受された、あなたは試すことができます。

function twoSearch($x, $data)
{
    $i = round(count($data)/2);
    $middle = $data[$i];
    if($x == $middle)
    {
        return $i;
    }
    else if($x > $middle)
    {
        twoSearch($x, array_slice($data, 0, $i));
    }
    else
    {
        twoSearch($x, array_slice($data, $i, -1));
    }

    return false;
}

var_dump(twoSearch(16,[11,12,13,14,15,16,17,18,19,20]));
  1. 文字セット:入力文字列、文字のセットを含む文字列が取得され、ソート順とプレス(英語)

思考

並べ替え配列、重複除外に文字列。

function character($data)
{
    $array = str_split($data); 
    $array = array_unique($array); 
    sort($array); 
    return implode('', $array);
}

var_dump(character('optimization'));
  1. 次のファイルトラバースファイルのすべてのファイルとサブフォルダの下で

思考

ファイルやフォルダ、トラバースの読み取りの読み取りに使用するPHP関数。

function readFile($dir)
{
    $data = [];

    if($handle = opendir($dir))
    {
        while($file = readdir($handle) != false)
        {
            if($file != '.' && $file != '..')
            {
                if(is_dir($dir.'/'.$file))
                {
                    $data[$file] = readFile($dir.'/'.$file);
                }
                else
                {
                    $data[] = $file;
                }
            }
        }

        closedir($handle);
    }
    return $data;
}
  1. Nレベルの手順は、あなただけのクラス1またはクラス2クロス、Qを渡ることができます。レベルを完了するためにどのように多くの方法。

思考

人がn段目に行ったとき、2つだけの可能性、レベルを横切るN-1グレードレベル、または2つのn-1段階を横切ります。

function fibonacci($n)
{
    if($n <= 2)
    {
        return $n == 1 ? 1 : 2;
    }

    $n = fibonacci($n - 1) + fibonacci($n - 2);

    return $n;
}

var_dump(fibonacci(10));
リリース5元の記事 ウォンの賞賛0 ビュー79

おすすめ

転載: blog.csdn.net/jy615183000/article/details/105271632