#はじめに
本日の企業との面談でコードについてテストされる場面があり、そのときはうまく答えることができなったので、冷静になった今なら、どう答えるか考えてみました。
##問題
問題はあくまで例えです。
"aiueo"
#=>"oeuia"
文字列を逆から出力されるようにする。
ただし、reverseメソッド
は使わない。
##回答
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]
の部分)のが、なんかスマートじゃないなぁ…
これならどうだ?
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文字の文字列だが、これがもっと増えて上のコードでは、処理に時間がかかってしまうとしたら、どうしますか?
##回答
ここで考えられるのは、そもそも配列に入れないと解決できない問題なのか?
いや、文字列のまま処理することもできるかも…
よく考えたら、文字列でも添字を付ければ、任意の文字を指定して出力することができる?
str = "aiueo"
puts str[1]
#=>i
これが成り立つなら…
これだ!
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メソッド)すら、頭に浮かばなくて、より焦るという悪循環でした(笑
それにしても、自分のポートフォリオを見ていただけたことは素直に嬉しかった。質問に対して明確に答えられなかったところはたくさんあったし、課題はまだまだあるけど、現役エンジニアの方に見てもらったのは初めてだったので、ちょっと恥ずかしくもありました。
メソッドの裏側の処理なんて考えたことがなかったから、とても勉強になりました。
面接を通して、エンジニアを身近に感じることができた一日でした。
もし、ご縁があれば、よろしくお願いします。
…と、ここで言ったところで何も変わらないかっ(笑