コーディングの筋トレ
はじめに
新しい技術として機械学習を学んでいます。
それとは別に最適かつ挑戦的なコーディング力を改めてトレーニング中です。
それとは別に最適かつ挑戦的なコーディング力を改めてトレーニング中です。
atCoderはLeetCodeなど
コーディングテストのサイトを利用することで
コンテスト的な感覚で自分のシンプルなコーディング力を試せます。
LeetCodeの方がその場でRunTestしたり課題もジャンル豊富でオススメ。
どのようなアプローチを取っているか
試行錯誤の中での思ったことを徒然と記します。
例題
シンプルによくありそうな例題に挑戦。
レベルとしては初級あるいは初級中級の間でしょうか。
レベルとしては初級あるいは初級中級の間でしょうか。
「任意の長さである文字列を入力し、重複している文字の種類を出力せよ」
例えば “abccddd” と入力したら “2” と出力します。
“abcdef”であれば “0” を出力します。
ロジックのアプローチ
色々方法はあるかと思います。
以下の手法はベストではないかもしれないですが
ロジックとコードの行き来がしやすいと思って挙げます。
以下の手法はベストではないかもしれないですが
ロジックとコードの行き来がしやすいと思って挙げます。
- 入力する(これをNとする)
- Nをnという一文字ずつの配列に置き換える
- n配列を要素に重複の無い配列mにする
- 各要素がnに対して2個以上であればカウンタを増やす(初期値0)
というアプローチです。
まあ、それほど重くならないだろうと踏んでO(ビッグオー)の計算はしてません。
言語の選択
コーディングテストに投稿する際に最初に悩んだもの。
どの言語にするか。
どの言語にするか。
最終的にはPython3に落ち着きました。
普段はPHPをやっているけれども、なんだかんだすっきりしたコードになるし速い。
Rubyでもまあまあいい気がします。PHPは好みでないことが判明。
1. PHP
1 2 3 4 5 6 7 8 | <?php $n = str_split(preg_replace("/(\r|\n|\r\n)/", "", fgets(STDIN))); $cnt = 0; $nn = array_count_values($n); foreach ($nn as $key => $count) { if ($count > 1) $cnt++; } echo $cnt; |
最初の
1 | "<?php" |
おまじないがそもそも邪魔。。。
変数の前の “$” も邪魔。
2. Ruby
1 2 3 4 5 6 | n = gets.gsub(/(\r|\n|\r\n)/, "") cnt = 0 n.split('').uniq.each do |e| cnt += 1 if n.count(e) > 1 end p cnt |
PHP もですが、標準入力の最後の改行を含んでしまっている。
uniqやeachなどフィルタ的な感覚で処理を重ねていけるのは良いところ。
おそらくeachもワンラインで書ける。
3. Python
1 2 3 4 5 | n = list(input()) cnt = 0 for i in set(n): if n.count(i) > 1: cnt += 1 print(cnt) |
コードがシンプルに、かつロジックも必要最小限な気がする。
setなどは知らなければ最初調べる程度で
その他は直感的にロジックに従って書いてる感覚。
その他のアプローチ
前提の条件になるとは思いますが
コーディングはロジックが決まって投影するだけ。
なので数学的にビッグ・オーを最小にしながら解決するために
日頃から高校数学程度の脳トレーニングは有効な気がします。
コーディングはロジックが決まって投影するだけ。
なので数学的にビッグ・オーを最小にしながら解決するために
日頃から高校数学程度の脳トレーニングは有効な気がします。
Author Profile
スターフィールド編集部
SHARE