고통스러운 면접 질문

WBOY
풀어 주다: 2016-07-30 13:29:50
원래의
980명이 탐색했습니다.

어제 면접 질문 두 개를 봤는데, 첫 번째 질문에는 많은 분들이 답변해주셨는데, 두 번째 질문에는 답변해주시는 분들이 적더라고요. 저는 최근 PHP를 배우고 있기 때문에 오늘 이 글에서는 PHP를 기반으로 두 번째 분석을 가져왔습니다.

면접 질문 2개를 첨부합니다.

 1: 홀에는 100개의 조명이 있고, 각 조명에는 1부터 100까지 번호가 매겨져 있습니다. 각 조명은 스위치로 제어됩니다. (스위치를 한 번 누르면 불이 켜지고 다시 누르면 불이 꺼집니다. 스위치 번호는 제어되는 전등과 동일합니다.) 처음에는 모든 불이 꺼집니다. 이제 다음 규칙에 따라 스위치를 누르십시오.
처음으로 모든 조명을 켜보세요.
두 번째로 2의 배수인 스위치를 모두 누릅니다.
세 번째로 3의 배수인 스위치를 모두 누릅니다.
등등. N번째에는 N의 배수인 스위치를 모두 누릅니다.
버튼을 100번 누른 후에도 홀에 몇 개의 조명이 아직 켜져 있는지 물어보세요.
2: 27cm의 얇은 나무 막대가 있고, 3cm, 7cm, 11cm, 17cm, 23cm 다섯 위치에 각각 개미가 있습니다. 나무 기둥은 매우 얇아서 동시에 개미를 통과할 수 없습니다. 처음에는 개미의 머리가 왼쪽을 향하고 있는지, 오른쪽을 향하고 있는지는 임의적이었습니다. 그들은 앞으로만 걷거나 돌아설 뿐, 물러서지는 않았습니다. 개미 두 마리가 만나면 동시에 돌아서 반대 방향으로 걷는다. 개미가 초당 1센티미터씩 움직일 수 있다고 가정해 보세요. 모든 개미가 나무 기둥을 떠날 수 있는 최소 시간과 최대 시간을 구하는 프로그램을 작성하세요.

첫 번째는 비교적 간단해서 자세히 설명하지 않겠지만, 두 번째는 보기만 해도 머리가 아프다.

이 질문을 간단히 분석해 보겠습니다.

질문 자체로 볼 때, 개미 다섯 마리의 위치를 ​​동시에 고려하는 것은 정말 혼란스러운 것 같습니다. 다행히도 질문의 마지막 문장은 여전히 ​​매우 유용합니다. 모든 개미가 나무 기둥을 떠나는 최대 시간이자 최소 시간입니다. 얇은 막대를 수평축으로 사용합니다. 개미의 위치가 주어졌습니다. 마지막으로 떠난 개미의 위치가 <=0 또는 >=27이면 모든 개미가 나무막대를 떠납니다. (말도 안 되는 소리인 것 같습니다.)

초속 1미터, 이 질문 설정은 사람들을 편안하게 만들기에 충분합니다. 결국 개미가 여기까지 이동한 시간은 개미가 이동한 거리의 값과 수치적으로 동일합니다. (모든 개미가 나무 기둥을 떠나 원래 속도로 계속 움직인다고 생각한다면). 그리고 그들은 동시에 움직입니다.

개미의 이동 방향은 왼쪽, 오른쪽 두 가지뿐입니다. 좌표축의 실제 상황을 고려하여 오른쪽으로의 이동을 1로 가정하면 왼쪽으로의 동등한 이동은 -1입니다. 컴퓨터의 바이너리 세계에서 이 단계를 고려하는 것이 중요합니다.

좋습니다. 이해하든 안 하든, 더 중요한 내용은 다음과 같습니다.

최대 시간과 최소 시간을 찾는 것은 숫자 더미에서 최대 및 최소 숫자를 찾는 것과 같습니다. 핵심은 비교를 수행할 마지막 시간을 찾는 것입니다. 시간이 무슨 상관이 있나요? 타이틀 디자인으로 볼 때 각 개미의 초기 동작 상태와만 관련이 있어야 합니다. 해당 기간 중 특정 시점에 특정 개미의 이동 상태를 걱정할 필요가 있을까요? 필요하지 않습니다. 그러면 문제가 더 복잡해질 뿐입니다.

개미의 초기 상태는 2^5=32입니다. 분명히 이러한 32가지 유형의 시간을 각각 계산해야 하며 간단한 루프를 사용할 수 있습니다.

개미의 움직임 상태에 주목하는 것은 위치와 방향이라는 두 가지 변수에 지나지 않습니다. 그래서 여기서는 $arr 및 $b 두 개의 배열을 간단히 소개하겠습니다. 전자는 특정 지점의 현재 위치를 설명하는 데 사용되고 후자는 현재 방향을 설명하는 데 사용됩니다. $b[i]

앞서 설명했듯이 값은 -1 또는 1이어야 합니다.

이를 고려하여 우리 생각에 따라 '$arr' 및 '$b' 배열에 초기 값을 할당할 수 있습니다. 루프를 만들기 위해 시간 '$i'를 사용합니다. 각 개미가 1초마다 이동한 후 '$arr[$k]==$arr[$k-1]'일 때 일치하는 상태 값 '$b[k ]'를 변경합니다. 값. 모든 '$arr'의 '값'이 <=0 또는 >=27이면 루프를 중지하고 '$i'를 반환합니다. 루프 순회가 많이 사용됩니다. 물론 단순화를 위해 '$arr[$k]'가 더 이상 극점에 없으면 unset() 함수를 사용하여 삭제할 수 있습니다. 마지막으로 '$arr'이 비어 있다고 판단하여 루프를 종료합니다.

주요 내용에 대해 이야기한 후에도 여전히 작은 세부 사항을 다루어야 합니다. 개미의 이동 상태를 설명하는 배열 "$b"를 생성하는 방법은 무엇입니까?

불가능합니다. 5마리의 개미에 대해 32개의 상황이 있는데, 10마리의 개미에 대해 1024개의 상황을 수동으로 생성하는 것은 정말 고통스럽습니다. 하지만 32개의 배열을 생성하는 방법을 분명히 알고 있으므로 이를 사용해야 합니다. 그러므로 십진수를 길이가 5인 이진수로 변환하는 것을 생각하기 쉽습니다. 그런 다음 이 이진수의 0을 -1로 바꿉니다. 대체된 문자열을 배열로 변환합니다.

마지막으로 해당 코드를 붙여넣습니다.

<?<span>php
</span><span>for</span>(<span>$j</span>=0;<span>$j</span><32;<span>$j</span>++<span>){

    </span><span>$var</span>=<span>sprintf</span>("%05b", <span>$j</span><span>);

    </span><span>$var</span>=<span>str_replace</span>('1', '1|', <span>$var</span><span>);
    </span><span>$var</span>=<span>str_replace</span>('0', '-1|', <span>$var</span><span>);

    </span><span>$b</span>=<span>explode</span>('|',<span>$var</span><span>);

    </span><span>$res</span>=getRes(<span>$b</span><span>);


    </span><span>if</span> (<span>isset</span>(<span>$min</span><span>)) {
        </span><span>if</span> (<span>$res</span><<span>$min</span><span>) {
            </span><span>$min</span>=<span>$res</span><span>;

        }
    }</span><span>else</span><span>{
        </span><span>$min</span>=<span>$res</span><span>;
    }
    </span><span>if</span> (<span>isset</span>(<span>$max</span><span>)) {
        </span><span>if</span> (<span>$res</span>><span>$max</span><span>) {
            </span><span>$max</span>=<span>$res</span><span>;
        }
    }</span><span>else</span><span>{
        </span><span>$max</span>=<span>$res</span><span>;
    }
    </span><span>print_r</span>(<span>$b</span><span>);
    </span><span>echo</span> "此次结果是".<span>$res</span>.'   $max='.<span>$max</span>.'  $min='.<span>$min</span><span>;
    </span><span>echo</span> "<hr/>"<span>;

}


</span><span>echo</span> "最大值是".<span>$max</span>."最小值是".<span>$min</span><span>;


</span><span>//</span><span>获得某种情况下的时间</span><span>function</span> getRes(<span>$b</span><span>){
    </span><span>$arr</span>=<span>array</span>(3,7,11,17,23<span>);
    </span><span>for</span>(<span>$i</span>=1;<span>$i</span><100;<span>$i</span>++<span>){

        </span><span>foreach</span> (<span>$arr</span><span>as</span><span>$k</span> => <span>$val</span><span>) {
            </span><span>$arr</span>[<span>$k</span>]=<span>$val</span>+<span>$b</span>[<span>$k</span><span>];
            </span><span>if</span> (<span>$arr</span>[<span>$k</span>]==@<span>$arr</span>[<span>$k</span>-1<span>]) {
                </span><span>$b</span>[<span>$k</span>]=-<span>$b</span>[<span>$k</span><span>];
                </span><span>$b</span>[<span>$k</span>-1]=-@<span>$b</span>[<span>$k</span>-1<span>];
            }

            </span><span>if</span> ((<span>$arr</span>[<span>$k</span>]>=27)||(<span>$arr</span>[<span>$k</span>]<=0<span>)) {
                </span><span>unset</span>(<span>$arr</span>[<span>$k</span><span>]);
            }
        }


        </span><span>if</span> (<span>empty</span>(<span>$arr</span><span>)) {
            </span><span>return</span><span>$i</span><span>;
        }


    }

}</span>
로그인 후 복사

PHP는 수학 연산을 잘 못하는데, 저도 수학 연산을 잘 못합니다. 위에서 작성한 코드로는 작업을 거의 완료할 수 없는 것 같습니다. 또한 귀하의지도를 받기를 바랍니다.

위 내용은 관련 내용을 포함하여 괴로운 면접 질문을 소개한 내용이 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿