69255


下記リンク先のアルゴリズムの問題に取り組んでいるのですが、私の作ったコードではエラーになってしまい、理由がわからないため質問させていただきます。

[Intermediate Algorithm Scripting: Missing letters -
freeCodeCamp.org](https://www.freecodecamp.org/learn/javascript-algorithms-
and-data-structures/intermediate-algorithm-scripting/missing-letters)

以下のように動作するコードを作りたいです。  
（抜けている文字を返す）

[code]

    myFunction("abce")             //return "d".
    myFunction("stvwx")            //return "u".
    myFunction("bcdf")             //return "e".
    myFunction("abcdefghijklmnopqrstuvwxyz")   //return  undefined.(a~zまで揃っている場合はundefined）
    
[/code]

以下が、私の作ったコードです。

[code]

    function myFunction(str) {
      for(var i=0; i<str.length; i++){
        return str.charCodeAt(i)!==str.charCodeAt(i+1)-1
        ? String.fromCharCode(i+1)
        : undefined;
      }
    }
    
[/code]

どこに不備があるか、どなたかご指摘いただけないでしょうか。  
どうぞよろしくお願いいたします。


CC BY-SA 4.0
2020-08-04T20:42:35.303
69252
2020-08-05T09:00:53.553
2020-08-05T05:04:53.690
3060
40891
question
javascript
抜けている文字を返すアルゴリズムの問題について


return すると for の中であろうと関係なく function から抜け出してしまいます。つまり質問者さんのコードでは for
ループの繰り返しの最初の 1 回で終了してしまいます。

「最初から最後まで条件を満たしているかどうかチェックしつつ、満たしていなかったらその場で return し、最後まで満たしていればループを抜けた後に
return する」ような形に書き換えてみてください。


CC BY-SA 4.0
2020-08-04T22:29:26.207
69253
2020-08-04T22:29:26.207
19110
69252
answer


「どこに不備があるか、どなたかご指摘いただけないでしょうか。」とのことなので、ざっと不備のある点を指摘していきます。

出題自体には色々なやり方が考えられますが、できるだけ現在のあなたのコードが活かせるという観点でチェックしています。

  * forループの中で必ずreturnしている  
returnするのは、「抜けている文字」が見つかったときだけのはずです。undefinedを返すのは、最後までチェックして「抜けている文字」が見つからなかったときですから、根本的にロジックがおかしいです。ざっくりと、

[code]      for( ... ) {

        if( 抜けている文字がある ) {
          return 抜けている文字
        }
      }
      //「抜けている文字」が見つからなかったとき
      return undefined;
    
[/code]

と言う感じになるはずです。

  * for文の範囲がまずい  
「抜けている文字」のチェックの中で`str.charCodeAt(i+1)`を参照しているのに、`for(var i=0; i<str.length;
i++){`と文字列の最初から最後までループを回しています。これでは、上記の修正をしても、`i`が文字列の最後に来たときに、`str.charCodeAt(i+1)`が範囲外をアクセスすることになるので、実行時エラーになります。現在のチェックの式を使うならループの範囲は文字列の最後の位置より1個手前までにしないといけません。

  * 文字列の位置を文字コードとして返そうとしている  
`String.fromCharCode(i+1)`という部分がありますが、この中で`i+1`は、「`str`の中で今調べている場所の次の場所」を表す整数値であって、文字コードではありません。「抜けている文字」が見つかった場合には、`String.fromCharCode(「抜けている文字」の文字コード)`を返してやらないといけません。

わかりにくい点があれば、コメント等でお知らせください。


CC BY-SA 4.0
2020-08-04T22:44:03.963
69255
2020-08-04T22:44:03.963
13972
69252
answer


こちらでうまく動きました。

<https://jsbin.com/vuvabazidu/1/edit?html,js,console>

[code]

    function myFunction(str) {
      for(var i=0; i<str.length - 1; i++){
        if (str.charCodeAt(i) !== str.charCodeAt(i+1) - 1) {
          return String.fromCharCode(str.charCodeAt(i) + 1);
        }
      }
    }
    
    console.log(myFunction("abce"))
    console.log(myFunction("stvwx"))
    console.log(myFunction("bcdf"))
    console.log(myFunction("abcdefghijklmnopqrstuvwxyz"))
    
[/code]

結果  
"d"  
"u"  
"e"  
undefined


CC BY-SA 4.0
2020-08-05T07:59:45.693
69271
2020-08-05T09:00:53.553
2020-08-05T09:00:53.553
21047
21047
69252
answer