ただいまpaizaにで勉強中。今回は文字列操作です。

まずはこのあたりから。

文字の検索 | レベルアップ問題集

c は S の何文字目に現れるかという問題。C#ならこれでいいんじゃないかな。

ただ、1文字ずつ調べるというのが問題の趣旨ならこうかな。

部分文字列

文字列 S と整数 i , j が与えられるので、S の i 文字目から j 文字目までの部分文字列を出力せよという問題。
これもC#に関しては解説なし。ということで解説するとSubstringを使えば一瞬で解決。

文字列の挿入

文字列 S , T と、整数 N が与えられるので、S の N 文字目の後ろに T を挿入した文字列を出力せよという問題。文字列を最初からN文字までとN文字以降に分割してあいだにTを挟めばOK。

文字列の書き換え

文字列 S と整数 i と文字 c が与えられるので、S の i 文字目を c に書き換えよという問題。

これも本質的にはなにも変わりません。

文字列から数値への変換

数値を表す文字列 S が与えられるので、 S – 813 の値を求めよという問題。

これはパス。これができないならなぜこれまでの問題はできたのかという話になるからです。

数値から文字列への変換

数値 X , Y が与えられるので、X + Y の計算結果の先頭から N 文字目の数字を出力せよという問題。

計算してToString()で文字列に変換。あとはこれまでの応用。

大文字から小文字への変換

ToLower()を使えばなんでもないね。

大文字小文字の反転

大文字小文字混合の文字列が与えられるので大文字小文字を反転させよという問題。

以下の方法でもいいがあまりいい方法ではない。もっと短く書けないか?

そこでa~zとA~Zは文字コードが連続していることを利用して以下のようなコードを書いてみる。しかし管理人が勉強不足なだけで文字が大文字か小文字かを調べる方法が存在した。ちなみに以下のコードはこれはこれで動作する。

System.Char.IsUpperメソッドを使えば大文字かどうかわかるのでそうであれば小文字にそうでなければ大文字に変換する。

数値判定

文字列 S が与えられるので、 S を整数に変換できる場合には “YES” , そうでない場合は “NO” を出力せよという問題。

文字列をint型に変換できるかどうかで判断できると思い、以下のようなコードを書いたがこれは正しくない。

「数値に変換できるとは、すべての文字が0~9である」という条件がつけられているので、文字がすべて0~9なのかどうかを調べなければなりません。

言語によっては文字が 0 … 9 の数値であるかどうかを判定する関数があるものもありますが、0 … 9をすべて空文字に置換して置換後に空文字になっているならすべての文字が0 … 9であったと判断する方法はどうでしょうか? これでもテストは通ります。

重複の削除

重複を削除するのであえばみんなのアイドル?Linqを使えば簡単にできます。

重複排除の処理を自分で実装せよというのが問題の趣旨であるなら、先頭から順にその数字が既に現れたかどうかを調べて、はじめて出現した数字だけを答えである文字列の末尾に追加することで答えを取得することができます。

ということで、「なんだ、ちょろいじゃん♪」と思ったのだが、やや解きごたえのあるものもあったので紹介する。

パスワード作成

次のようなルールにのっとって N 文字のパスワードを設定することにした。
N 文字のうち、 Q 文字だけ覚えておく文字を決めておく。
具体的には n_i 文字目を c_i とだけ決めて、残りの全ての文字を C にする。
パスワードはなにかという問題。

まさかこんな方法でパスワードを決めている人はいないでしょうね。簡単にアカウントを乗っ取られます。

表記の訂正

先頭に必要のない 0 がいくつかついてしまう
小数である数値の末尾に必要のない 0 がいくつかついてしまう
小数である数値に小数点が複数個ついてしまう

このようなデータを正しく訂正せよという問題。

数式の計算

計算式が”4+3-2+1″のような文字列で渡されるので答えを計算せよという問題。

解説では 文字列を数字を表す文字列と演算子を表す文字列に分ける。
分けた後の数字を表す文字列を数値に変換したのち、演算子に従って計算を行う。

とあるが、加法の結合法則がなりたつので、足し算として分解し、残りの部分で引き算をして最後に全部足すという方法で答えを求めています。

巨大な数の足し算

100桁を超える巨大な数同士の足し算。ただし桁数は同じという問題。

巨大な数のかけ算

最後はかけ算。ラスボス登場かと思いきや巨大な数と一桁のかけ算。これなら簡単だと思っていたら引っかけが。一桁が0の場合を想定していなかった。ということで凡ミスで不合格。