C#で文字列を文字単位ではなく単語単位で反転させる方法
C#で文字列を扱う際、「This is my book」のような文章の単語の順序だけを逆にしたいケースがあります。単純に文字を反転すると「koob ym si siht」になってしまいますが、ここでは単語単位で反転させ「book my is This」を得る方法を解説します。
アルゴリズムの考え方
この問題は、以下の2段階の処理で解決できます。
- reverseWordsメソッドを作成し、char型の配列を引数として受け取ります。
- 文字列を先頭から走査し、空白(スペース)に到達するたびに、その直前までの単語を反転します。
- 最後のステップとして、文字列全体をインデックス0からn-1まで反転します。
処理の流れ
例として「This is my book」という文字列を見てみましょう。
- 第1段階: 各単語を個別に反転すると、「koob ym si siht」になります。
- 第2段階: 文字列全体を反転すると、最終的に「book my is This」が得られます。
この手法の時間計算量はO(N)です。文字列を2回走査するだけで済むため、非常に効率的なアルゴリズムです。
C#での実装例
using System;
namespace ConsoleApplication{
public class Arrays{
static void reverse(char[] str, int start, int end){
char temp;
while (start <= end){
temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
public char[] reverseWords(char[] s){
int start = 0;
for (int end = 0; end < s.Length; end++){
if (s[end] == ' '){
reverse(s, start, end);
start = end + 1;
}
}
reverse(s, 0, s.Length - 1);
return s;
}
}
class Program{
static void Main(string[] args){
Arrays a = new Arrays();
string s = " This is my book ";
var res = a.reverseWords(s.ToCharArray());
Console.WriteLine(new String(res));
Console.ReadLine();
}
}
}コードのポイント
reverseメソッドは、指定された開始位置と終了位置の間の文字を両端から入れ替えていくヘルパー関数です。reverseWordsメソッドでは、空白文字を検出するたびにその単語部分を反転し、次の単語の開始位置を更新しています。- 最後に文字列全体を反転することで、単語の順序が入れ替わります。
実行結果
book my is This
このように、追加のメモリをほとんど使わずに、単語の順序を効率的に反転させることができます。面接やコーディングテストでも頻出のアルゴリズムなので、ぜひマスターしておきましょう。
-
【JavaScript】補助変数を1つだけ使って文字列を反転させる方法
本記事では、任意の文字列が与えられたときに、補助用の変数をたった1つだけ使って、その文字列を反転させた結果を生成するJavaScriptプログラムを紹介します。 課題の条件 このプログラムには、以下のような厳しい制約が課されています。 組み込み関数(split() や reverse() など)や、独自に定義したカスタム関数を宣言・使用してはならない 使用してよいのはバニラJS(素のJavaScript)のみで、必要であれば基本的なループ構文を利用できる つまり「関数呼び出しに頼らず、ロジックを自分で組み立てる」ことが求められる練習問題です。 実装コード 上記の条件を満たすコードは以下のと
-
Androidで文字列を逆順に表示する方法をわかりやすく解説
本記事では、Androidアプリ開発において、ユーザーが入力した文字列を逆順(リバース)にして画面に表示する方法を実例とともに解説します。EditTextに入力されたテキストを、ボタンのクリックをきっかけに反転させてTextViewへ出力するシンプルなサンプルです。手順1:新規プロジェクトを作成するまず、Android Studioを開き、「File」→「New Project」から新しいプロジェクトを作成します。プロジェクト作成時に必要な項目をすべて入力してセットアップを完了させましょう。手順2:レイアウトファイル(activity_main.xml)を編集する次に、res/layout/a