0
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

面接で出題されたコーディングテストを冷静になって考えてみた

Last updated at Posted at 2021-02-01

#はじめに
本日の企業との面談でコードについてテストされる場面があり、そのときはうまく答えることができなったので、冷静になった今なら、どう答えるか考えてみました。

##問題
問題はあくまで例えです。

Ruby
"aiueo"
#=>"oeuia"

文字列を逆から出力されるようにする。
ただし、reverseメソッドは使わない。

##回答

Ruby
def reverse_str(str)
  array = str.split("")        #与えられた文字列を配列に一文字ずつ入れる
  ary_count = array.length     #配列の要素の数を数える

  ary_count.times do |i|       #配列の要素の数だけ繰り返し出力する
    print array[ary_count - i] #1周目はi=1になる
  end

  puts array[0]                #最後の文字だけ出力されないので、付け足す
end
str = "aiueo"
reverse_str(str)               #メソッドを呼び出す

とりあえず、少し調べたらこんな感じになりました。
最低限その場でこれくらいできたらよかったなぁ。

もう少し考えるか…
上のコードでは、一文字ずつ出力している(print array[ary_count - i]の部分)のが、なんかスマートじゃないなぁ…

これならどうだ?

Ruby
def reverse_str(str)
  array = str.split("")                #与えられた文字列を変数arrayに配列で一文字ずつ入れる
  re_str = []                          #出力するとき用の配列の入れ物を用意する

  array.length.times do |i|            #arrayの配列の要素の数だけ繰り返す
    re_str << array[ array.length - i] #出力用の入れ物にarrayの一番後ろの文字から配列で入れる
  end
  re_str << array[0]                   #arrayの一文字目を最後に入れる

  puts re_str.join                     #配列を文字列に変換して出力する
end
str = "aiueo"
reverse_str(str)                       #メソッドを呼び出す

もう一つ配列の入れ物を用意して(re_str = [])、一文字ずつ入れていき、最後に配列を文字列に変換する(puts re_str.join)。

##もう少し追加の問題

今は、5文字の文字列だが、これがもっと増えて上のコードでは、処理に時間がかかってしまうとしたら、どうしますか?

##回答
ここで考えられるのは、そもそも配列に入れないと解決できない問題なのか?
いや、文字列のまま処理することもできるかも…
よく考えたら、文字列でも添字を付ければ、任意の文字を指定して出力することができる?

Ruby
str = "aiueo"
puts str[1]
#=>i

これが成り立つなら…

これだ!

Ruby
def reverse_str(str)
  re_str = []                     #一文字ずつ文字をいれる配列の入れ物を用意する
  str.length.times do |i|         #文字列の文字数文だけ処理を繰り返す
    re_str << str[str.length - i] #配列に一文字ずつ最後の文字から入れる
  end
  re_str << str[0]                #文字列の最初の文字を一番最後に入れる
  puts re_str.join                #配列を文字列に変換して出力する
end
str = "aiueo"
reverse_str(str)                  #メソッドを呼び出す

今は、これが限界かなぁ…
これなら、さっきまでの、与えられた文字列を配列に入れ直す処理がなくなるので、少しは早くなるはず。
でも、re_str = []配列の入れ物を用意することが最適解なのかはわかりません。
ただ、re_str << str[0]の部分がスマートではないと思っています。どうしても最初の文字だけtimesメソッドに組み込むことができない…

##最後に
あ〜、こんな風に回答することができたらよかったんだなぁ…
本気で行きたい企業だっただけに、その場でできなくて、悔しいなぁ…
少し調べてやってみたけど、やっぱりこの過程が楽しいと思えました。
面接中は、信じられないくらい緊張して、コード打つときに頭真っ白になって、手が震えた(笑
VSCodeの開き方すらわからなくなってた…
さらには、簡単なメソッド(getsメソッド)すら、頭に浮かばなくて、より焦るという悪循環でした(笑

それにしても、自分のポートフォリオを見ていただけたことは素直に嬉しかった。質問に対して明確に答えられなかったところはたくさんあったし、課題はまだまだあるけど、現役エンジニアの方に見てもらったのは初めてだったので、ちょっと恥ずかしくもありました。

メソッドの裏側の処理なんて考えたことがなかったから、とても勉強になりました。
面接を通して、エンジニアを身近に感じることができた一日でした。

もし、ご縁があれば、よろしくお願いします。
…と、ここで言ったところで何も変わらないかっ(笑

0
7
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?