夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

文字列の反転

本日の1日1問プログラミング学習枠です。

〇お題

問題: 文字列の反転

与えられた文字列を反転させるプログラムを作成してください。プログラムは以下の要件を満たす必要があります:

ユーザーから文字列を入力として受け取ります。 入力された文字列を反転させ、反転後の文字列を表示します。 大文字と小文字を区別しないように文字列を反転させます。つまり、入力が "Hello" であれば "olleH" として反転される必要があります。 スペースや句読点などの非アルファベット文字は無視します。 この問題を解決するプログラムを作成し、異なる文字列に対してテストしてみてください。

〇筆者の回答

using System;
                    
public class Program
{
    public static void Main()
    {
        string input = "Hello";//入力値
        Console.WriteLine(InvertText(input));
    }
    public static string InvertText( string input)
    {
        string output = "";//文字列を初期化
        for(int i = 0 ;i<= input.Length-1; i++)//文字列の大きさループ
        {
            output += input.Substring(input.Length -1 -i ,1);//お尻から代入
        }   
        return output;
    }   
}

 筆者の考え方としては今回の場合入力が "Hello" であれば "olleH" として反転される必要がありますというお題であったためシンプルに逆さから文字列を再構成するプログラムを書きました。

 ループを使用しているため文字数が大きくなればなるほど処理も多くなるので、もしかしたらもっと最適化できるかもと思いながらそのメソッドを知らなかったので今回はこちらの回答を提出しました。

〇ChatGPT先生の添削

提供されたコードは、与えられた文字列を反転させるための効果的な方法を実装しています。以下はコードの評価と改善点です:

評価:

文字列反転ロジック: コードは文字列を反転させる効果的な方法を使用しています。ループを使用して文字列を逆順に構築することで、正しい結果を得ています。

関数の使用: InvertText 関数は再利用可能で分かりやすい名前を持っており、文字列の反転処理をカプセル化しています。

テストケース: テストケースを使用してコードを実行しました。

改善点:

StringBuilderの使用: 文字列を反転させる際には、StringBuilder クラスを使用することが効率的です。文字列の連結 (+= 演算子) は、大量の文字列を操作する際に効率が悪い場合があります。StringBuilder を使用することで、性能が向上します。 改善を加えたコードの一例を示します:

using System;
using System.Text;

public class Program
{
    public static void Main()
    {
        string input = "Hello";
        Console.WriteLine(InvertText(input));
    }

    public static string InvertText(string input)
    {
        StringBuilder output = new StringBuilder(input.Length);
        for (int i = input.Length - 1; i >= 0; i--)
        {
            output.Append(input[i]);
        }
        return output.ToString();
    }
}

StringBuilder を使用することで、文字列の反転処理が効率的に行われ、性能が向上します。この修正を加えることで、コードの性能と効率が向上し、繰り返しの文字列連結のオーバーヘッドを減らすことができます。評価として、提供されたコードは 90 点、改善版は 100 点と評価できます。

筆者が懸念していた通り文字列が大きくなればなるほどより効率的な処理があるようです。

〇StringBuilder

StringBuilderSystem.Text;のネームスペースで提供されるクラスです。

learn.microsoft.com

StringBuilderを使用することで新しい文字列を作成せずにメモリの消費を抑えて文字列を処理できます。

Append(input[i])で文字列をアペンドしますが、ここでループ処理を0からではなく、文字列の大きさから0になるまで減らす処理とすることで効率化しています。

for文は何も考えずにi++を使用することが多いので盲点でした。

        StringBuilder output = new StringBuilder(input.Length);
        for (int i = input.Length - 1; i >= 0; i--)
        {
            output.Append(input[i]);
        }
        return output.ToString();

可読性の上ではそこまで変わらない気はしますが、こちらの方がより効率的な処理となり良い回答になるようです。

本日は以上です。