>일일 프로그램 >PHP 지식 >PHP 무작위 선택 알고리즘 (2)

PHP 무작위 선택 알고리즘 (2)

藏色散人
藏色散人원래의
2019-02-18 15:12:178958검색

이전 글 "PHP Random Pick-One Algorithm (1)"에서는 PHP Pick-One Algorithm 면접 질문에 대해 간략하게 소개했습니다. 다음에는 계속해서 이전 내용을 결합하여 PHP 알고리즘을 자세히 설명하겠습니다.

PHP 무작위 선택 알고리즘 (2)

문제는 다음과 같습니다.

원숭이 무리가 원을 그리며 줄을 서고 1, 2,...,n에 따라 번호가 매겨져 있습니다. 그런 다음 첫 번째부터 세기 시작하고, m 번째까지 세고, 원 밖으로 쫓아내고, 뒤에서 세기 시작하고, m 번째까지 세고, 쫓아내고... 끝까지 이런 식으로 계속합니다. 이제 원숭이는 한 마리밖에 남지 않았는데, 그 원숭이를 왕이라고 부릅니다. 이 과정을 시뮬레이션하여 m, n을 입력하고 마지막 왕의 수를 출력하는 프로그래밍이 필요합니다.

솔루션 코드 예제는 다음과 같습니다.

<?php

function king($n, $m){
    $monkeys = range(1, $n);         //创建1到n数组
    $i=0;
    while (count($monkeys)>1) {     //循环条件为猴子数量大于1
        if(($i+1)%$m==0) {     //$i为数组下标;$i+1为猴子标号
            unset($monkeys[$i]);  //余数等于0表示正好第m个,删除,用unset删除保持下标关系
        } else {
            array_push($monkeys,$monkeys[$i]);     //如果余数不等于0,则把数组下标为$i的放最后,形成一个圆形结构
            unset($monkeys[$i]);
        }
        $i++;//$i 循环+1,不断把猴子删除,或 push到数组
    }
    return current($monkeys);  //猴子数量等于1时输出猴子标号,得出猴王
}
echo king(10,3);

여기서 King 메서드를 생성하고, 매개 변수 $n은 n 원숭이를 나타내고 $m은 m번째 원숭이까지 계산을 나타냅니다. 그런 다음 king 메소드 본문에서 먼저 range 함수를 통해 1부터 n까지 배열을 생성하고 $monkeys를 사용하여 이를 수신합니다. 그런 다음 while 루프를 사용하여 요구 사항을 충족하는 요소를 결정합니다.

while 루프의 조건은 원숭이 $monkeys의 수가 1보다 클 때 루프 본문이 실행된다는 것입니다. 루프 본문에서는 if...else를 사용하여 판단합니다. ($i+1)%$m==0, 즉 나머지가 0인 경우, 즉 m번째 원숭이가 계산되는 경우 unset을 사용합니다. 이 요소를 삭제하고 아래 첨자 관계를 유지합니다.

나머지가 0이 아닌 경우 array_push 함수를 사용하여 끝에 배열 첨자 $i를 넣어 원형 구조를 형성합니다. array_push 함수는 하나 이상의 요소를 배열의 끝으로 푸시(push)하는 데 사용됩니다.

마지막으로 $i 루프를 +1로 만들고, 계속해서 원숭이를 삭제하거나, 원숭이 수가 1이 되면 원숭이 라벨이 출력되고 원숭이 왕을 얻습니다.

위 방법에서 우리가 제공하는 매개변수는 10과 3이고 출력 결과는 다음과 같습니다.

4

는 원숭이 왕이 4라는 라벨이 붙은 원숭이라는 의미입니다.

이번 글은 PHP one-picking 알고리즘에 대한 소개를 마치겠습니다. 다음 글 "PHP Random One-picking Algorithm (3)"에서는 Xdebug를 사용하여 이 메서드를 실행하고 디버깅하는 구현 과정을 소개하겠습니다.

위 내용은 PHP 무작위 선택 알고리즘 (2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.