2010年エンジニア採用試験のコーディングスキル判定頻出問題

タイトルは釣り気味ですが、今回の転職活動中コーディングスキル試験があった3社全て同じ問題が出たので、サンプル数は少ないですがある程度事実です。こんなこと書くと会社に怒られるかな・・・

問題 ある文字列を反転させて表示する関数を書いてください。(制限時間5分)

  1. プログラミング言語は何で書いてもいいです。
  2. アルゴリズムを書く力を見ているので、言語の標準関数でString.reverse的なのを使うのは無しです。


さぁ、レッツトライ!


JavaScriptによる解答編(もちろんTMTOWTDIということで正解は一つに限りませんよ)

まずは誤答から

function strReverse (str) {
  var output = [];
  for ( var i = 0; i < str.length; i++ )  {
    output.unshift(str[i]);  // str[indexer]で先頭から1文字ずつ取得し(ここ間違い!)、output用の配列に「先頭から」詰め直す。
  }
  return output.join(""); // 空文字でjoinして文字列でreturn
}

さて、僕は最初に受けた面接でこのように書いてしまいました。(ちなみに、最初に受けた会社に入社したので断じてズルではないですよ!)
1社目と2社目ではホワイトボード上のテストで、面接官に「動きそうですね」と言っていただけたので検証していませんでした。ところが3社目は実際にノートPCを渡され、動くコードを書いてくださいと。自信満々に上のコードを書いたところ動かない・・・。すぐに"str[i]" =>"str.charAt(i)"と書き直して事なきを得ましたが、最初のコードはちょっと自信があったのでイマイチ納得感がなかった。

で、なぜ今日このエントリを書こうと思ったかと言うと、以下のエントリを見たからなのでした。

近頃の JavaScript は、String[indexer] 構文を使うことで文字列の各要素に直接アクセスすることができます。
var str = "abc";
alert(str[1]); // "b"
ただし、IE6, IE7 では String[indexer] 構文は機能しません。
# IE8 以降ならOK, IE6, IE7 では "abc"[0] は undefined になる(構文エラーにはならない)
"from : latest blog - String[indexer]をIE6,IE7でも使いたい!"

なるほどー。IE7だったから動かなかったのね。。ということで修正したクロスブラウザな解答は以下になります。

function strReverse (str) {
  var output = [];
  if ( !"0"[0] ) { // IEのこの仕様を敢えて条件節に使う。
    str = str.split(""); // これによりstrはStringじゃなくてArrayになる。
  }
  for ( var i = 0; i < str.length; i++ ) {
    output.unshift(str[i]);  // 先頭から1文字ずつ取得し、output用の配列に「先頭から」詰め直す
  }
  return output.join(""); // joinして文字列でreturn
}

これを読んだ面接官の皆様。この問題は超頻出問題のようなので変えた方がいいかもですよー。それでは。