表の編集:falsey値に注意!


falsey値とは?

falsy値はBoolean文脈falseにより評価される値である.

false値タイプ

falsy値は8種類あります.
  • false
  • 0:数字0
  • -0:負数0
  • 0n : BigInt 0
  • "":空弦
  • null:無価
  • undefined
  • NaN:数字ではない
  • COTEで..。

    falsy値については知っていますが、実際にはコードテストの練習中に感じたことに注意してください.
    2021年KACA採用連絡型実習問題です.
    2021ココア採用連絡型実習-表の編集
    当時のゲーテの後記を探せば、この問題がゲーテ部門の党派を分裂させたことがわかる.
    △これは3番目の問題で、4、5番目の問題はそれぞれLv.4、Lv.5です.
    最初は簡単なリスト解題だったが,効率部門は通過しなかったため,リストにオブジェクトを加え,双方向リストのような操作を実現した.
    const list = [];
    
    for (let i = 0; i < n; i++) {
        if (i == 0)
            list[i] = {prev : null, next : i + 1, exist: true};
        else if (i === n - 1)
            list[i] = {prev : i - 1, next : null, exist: true};
        else
            list[i] = {prev : i - 1, next : i + 1, exist: true};
    }
    次に、入力した各コマンドに対して実行する論理を示します.
    cmd.forEach((command) => {
        const [order, num] = command.split(' ');
        if (order === 'U') {
            let t = parseInt(num);
            while (t--) {
                cursor = list[cursor].prev;
            }
        } else if (order === 'D') {
            let t = parseInt(num);
            while (t--) {
                cursor = list[cursor].next;
            }
        } else if (order === 'C') {
            const {prev, next} = list[cursor];
    		// 연결리스트 삭제와 유사 (실제로 배열에서 사라지지는 않음)
            if (prev) list[prev].next = next; 
            if (next) list[next].prev = prev;
            list[cursor].exist = false;
            deleted.push(cursor);
            cursor = next === null ? prev : next;
        } else if (order === 'Z') {
            const repaired = deleted.pop();
            const {prev, next} = list[repaired];
    		// 삭제 전으로 돌아가게 만듬
            if (prev) list[prev].next = repaired;
            if (next) list[next].prev = repaired;
            list[repaired].exist = true;
        }
    })
    このロジックはよく動作しているように見えますが、28番のテストケース、8番の効率ケースでは実行時エラーが発生します.
    何日か悩んだあげく、友達(@dha)の助けで見つけた.
    ...
    if (prev) list[prev].next = next; // prev에 0이 들어올 수 있음
    ...
    if (prev) list[prev].next = repaired;
    ...
    なぜなら、null条件文に入っている0が条件文を通過しないようにするためです.
    (prev,nextにはインデックスが格納されているので、0を入力できます.)
    本当にでたらめなミスだ...
    正しく修正されたコードは次のとおりです.
    cmd.forEach((command) => {
        const [order, num] = command.split(' ');
        if (order === 'U') {
            let t = parseInt(num);
            while (t--) {
                cursor = list[cursor].prev;
            }
        } else if (order === 'D') {
            let t = parseInt(num);
            while (t--) {
                cursor = list[cursor].next;
            }
        } else if (order === 'C') {
            const {prev, next} = list[cursor];
    
            if (prev !== null) list[prev].next = next; // null 검사
            if (next !== null) list[next].prev = prev; // null 검사
            list[cursor].exist = false;
            deleted.push(cursor);
            cursor = next === null ? prev : next;
        } else if (order === 'Z') {
            const repaired = deleted.pop();
            const {prev, next} = list[repaired];
    
            if (prev !== null) list[prev].next = repaired; // null 검사
            if (next !== null) list[next].prev = repaired; // null 검사
            list[repaired].exist = true;
        }
    })

    の最後の部分

    fasly値段を知ったばかりの頃は、単に字を書くのは気をつけなければならないと思っていたのが過ぎてしまったので、それを機に考えが変わりました.
    単純にcoteを練習するとき、書き間違えたコードをつかむために何日かかかりましたが、実際の符号化テストなら?falsyチェックしていないので論理的に考えても落ちてくる.私はいつでも愚かな間違いを犯すことを認めます.文章を書くときは正確に書く習慣を身につけなければなりません.