paiza スキルチェック過去問題セット「検索履歴 PHP編」解答例

過去問題セットの方はコードを公開しても大丈夫とのことなので。


正解率が高い問題ですが、非常に苦労しました。
流れがそのまま出ているプロトタイプを残してあります。

いつも通り配列に入れていくと、後の「一致項目があるかどうか」のループで
エラーがでまくりました。2時間ぐらい悩んだと思う。

回避するために、「常に配列の一番最初に挿入する」「forを$j=1からまわす」「連番じゃなくなった配列を整える」の3手順が必要でしたが、
みなさんよくこの時間で解けるなあと思います。

もっと賢くて楽な方法があるのかもしれないですね・・・。
さておき。

kue

プロトタイプ(自分用の覚え書きでぐちゃぐちゃしているので、後述のできあがりをご覧ください。)

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

    $num = trim(fgets(STDIN));
    $daburi = false;//reset
    $search = array();
    
    
    for ($i = 0; $i < $num; $i++) {
        echo("------------i".$i."\n");
        
        $str = trim(fgets(STDIN));
        echo("strは".$str."\n");
        
        array_unshift($search, $str);//常に配列の最前列に挿入
        print_r($search);
        
        $con = count($search);
        echo("conは".$con."\n");
        
        //過去の履歴と一致があるか調べる
        for ($j = 1; $j < $con; $j++) {
            if($search[$j] == $str){
                echo("一致項目あり"."\n");
                $daburi = true;
                $daburi_num = $j;
            }
        }
    
        //一致項目があれば
        if($daburi == true){
            unset($search[$daburi_num]);
            $search = array_values($search);//配列を整える
            $daburi = false;
        }
    } 
    
    echo("------------final"."\n");
    print_r($search);
    echo("\n");//この行が無視されている
    
    foreach ($search as $key => $value){
        echo($value."\n");
    }

?>

出力結果

------------i0
strはbook
Array
(
[0] => book
)
conは1
------------i1
strはcandy
Array
(
[0] => candy
[1] => book
)
conは2
------------i2
strはapple
Array
(
[0] => apple
[1] => candy
[2] => book
)
conは3
------------i3
strはbook
Array
(
[0] => book
[1] => apple
[2] => candy
[3] => book
)
conは4
一致項目あり
------------i4
strはcandy
Array
(
[0] => candy
[1] => book
[2] => apple
[3] => candy
)
conは4
一致項目あり
------------final
Array
(
[0] => candy
[1] => book
[2] => apple
)

candy
book
apple

(いつもこんな風に流れを追っています。
皆さんはどうしているんだろう)

kue

できあがり

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

    $num = trim(fgets(STDIN));
    $daburi = false;//reset
    $search = array(); 
    
    for ($i = 0; $i < $num; $i++) {        
        $str = trim(fgets(STDIN));
        array_unshift($search, $str);//常に配列の最前列に挿入
        
        $con = count($search);
        
        //過去の履歴と一致があるか調べる
        for ($j = 1; $j < $con; $j++) {
            if($search[$j] == $str){
                //echo("一致項目あり"."\n");
                $daburi = true;
                $daburi_num = $j;
            }
        }
    
        //一致項目があれば
        if($daburi == true){
            unset($search[$daburi_num]);//削除
            $search = array_values($search);//配列を整える
            $daburi = false;
        }
    }
    
    //print_r($search);
    //echo("\n");//この行が無視されている

    //出力
    foreach ($search as $key => $value){
        echo($value."\n");
    }

?>

ところでこの過去問のphp画面でだけ、
echo(“\n”);
が無視されるようです。非常に困りました。
直接は関係ないけど視覚的に出力テストのときにごちゃごちゃで、脳が混乱して大変でした。

paiza スキルチェック過去問題セット(php)

https://paiza.jp/works/mondai/skillcheck_archive/problem_index?language_uid=php

array_unshift — 一つ以上の要素を配列の最初に加える

https://www.php.net/manual/ja/function.array-unshift.php

配列の要素を削除する

https://uxmilk.jp/8884

いつもの!

1+