-
C++のsizeof演算子とは?基本的な使い方と実践的な活用例を解説
sizeof演算子は、C言語およびC++で最もよく使われる演算子のひとつです。渡されたデータ型やデータ構造のサイズ(バイト数)を計算するために使用され、符号なし整数型の値を返します。プリミティブ型(基本データ型)はもちろん、複合データ型にも適用できる点が大きな特徴です。データ型に直接sizeof演算子を適用すれば、その型が占めるメモリサイズを簡単に確認できます。基本データ型のサイズを確認する#include <bits/stdc++.h> using namespace std; int main() { cout << sizeof(int) <<
-
C++のmain()関数におけるreturn文とexit()の違いを徹底解説
プログラマーであればコードを書き、コードを書くなら関数を使い、関数を使う以上、必ずreturn文やexit文に触れることになります。この記事では、return文とexit文がそれぞれどのような役割を持つのか、そして両者の違いについて詳しく解説していきます。C++における基本的な動作returnは、実行フローの制御を呼び出し元の関数へ返すステートメントです。exitは、使用されたその時点でプログラムを終了させるステートメントです。int main()とはmain()関数はプログラムの実行開始点となる場所です。プログラムはmain()関数から実行され、戻り値の型がintであるため、何らかの整数値を
-
C++で反転アルゴリズムを使って配列を回転する方法を解説
本記事では、与えられた配列をd要素だけ回転させる問題を、反転アルゴリズム(Reversal Algorithm)を用いて解く方法を詳しく解説します。まず、次のような入出力を想定してみましょう。 入力 : arr[] = [1, 2, 3, 4, 5, 6, 7], d = 2 出力 : arr[] = [3, 4, 5, 6, 7, 1, 2] 説明 : 配列を d = 2 だけ左方向に回転させます。ポイントは、この操作を「反転」のテクニックだけで実現することです。 反転テクニックによる配列の回転について検討した結果、次の3つのステップで目的を達成できることがわかります。 ステップ1: ま
-
C++で配列を右にk要素回転!反転アルゴリズムの仕組みと実装を徹底解説
この記事では、与えられた配列を右方向にk要素だけ回転させるための「反転アルゴリズム(Reversal Algorithm)」について詳しく解説します。入力 : arr[ ] = { 4, 6, 2, 6, 43, 7, 3, 7 }, k = 4 出力 : { 43, 7, 3, 7, 4, 6, 2, 6 } 説明 : 配列の各要素を右に4つ移動させると { 43, 7, 3, 7, 4, 6, 2, 6 } になります。 入力 : arr[ ] = { 8, 5, 8, 2, 1, 4, 9, 3 }, k = 3 出力 : { 4, 9, 3, 8, 5, 8, 2, 1 }解決策への
-
C++で双方向リンクリストを反転する2つのアプローチ
この記事では、双方向リンクリスト(doubly linked list)をC++で反転するための複数のアプローチを解説します。たとえば、次のような入力と出力を考えます。入力 : {1, 2, 3, 4} 出力 : {4, 3, 2, 1}真っ先に思いつく方法はおそらく1つだけですが、ここでは「通常のアプローチ」と「変則的なアプローチ」の2つの方法を紹介します。通常のアプローチ(ポインタの入れ替え)このアプローチでは、リストを先頭から順に走査しながら、各ノードのnextポインタとprevポインタを入れ替えていきます。走査が完了した時点で、リスト全体が反転された状態になります。実装例#includ
-
C++で指定したサイズのグループごとに双方向連結リストを反転する方法
問題概要 この問題では、双方向連結リストの先頭ノードへのポインタと整数 k が与えられます。リストをサイズ k のグループごとに区切り、各グループ内でノードの並びを反転する必要があります。 たとえば、次のようになります。 入力:1 <-> 2 <-> 3 <-> 4 <-> 5(双方向連結リスト)、k = 3 出力:3 <-> 2 <-> 1 <-> 5 <-> 4 解法のアプローチ この問題は再帰を用いたアルゴリズムで効率的に解くことができます。基本的な考え方は以下の通りです。 先頭から k 個
-
C++で連結リストを指定サイズのグループごとに反転する方法
この記事では、片方向連結リスト(Singly Linked List)を扱い、リストを k個ずつのグループ に分けて反転する方法を解説します。問題の概要入力:1->2->3->4->5->6->7->8->NULL、K = 3出力:3->2->1->6->5->4->8->7->NULL入力:1->2->3->4->5->6->7->8->NULL、K = 5出力:5->4->3->2->1->8->7->NU
-
C++で連結リストを反転する方法【反復・スタック・再帰の3つのアプローチ】
この記事では、C++を使って単方向リンクリスト(片方向連結リスト)を反転する方法を解説します。目標は、与えられた連結リストのノードのつながりを逆向きに並べ替える関数を実装することです。 入力: 連結リスト : 1->2->3->4->NULL 出力: 関数の処理後 : 4->3->2->1->NULL 解決のためのアプローチ 連結リストを反転する方法はいくつかあります。最も直感的なのは、リストを先頭から順に走査しながら、その場でポインタをつなぎ替えていくというシンプルな手法です。本記事では、次の3つのアプローチを紹介します。 シンプルなアプロ
-
PL/SQLで数値を逆順にする方法
PL/SQLは、SQLの機能と手続き型のコマンドを1つに統合したブロック構造の言語です。本記事では、与えられた数値を逆順に並べ替えるPL/SQLプログラムについて解説します。 入力 : 98765 出力 : 56789 説明 : 98765を逆から並べた数値は56789です。 入力 : 56784 出力 : 48765 説明 : 「56784」を逆から並べた数値は「48765」です。 解決のためのアプローチ num を10で割った余りを求めることで、数値の末尾の桁を取り出します。 取り出した桁を、別の変数 reversed_num に加算していきます。 num が0になったかどうかを判定
-
PL/SQLで文字列を反転する方法をわかりやすく解説
PL/SQLは、SQLの機能と手続き型コマンドを組み合わせたブロック構造言語です。英語に近い自然な記述でデータベース操作を行えるのが特徴で、Oracleデータベースの開発で広く利用されています。 この記事では、指定された文字列を反転するPL/SQLプログラムの作成方法について詳しく解説します。 処理内容の例 入力 : taerGsIdoG 出力 : GodIsGreat 説明 : 「taerGsIdoG」を逆順に並べ替えると「GodIsGreat」になります。 入力 : LQS 出力 : SQL 説明 : 「LQS」を逆順に並べ替えると「SQL」になります。 解決のためのアプローチ 文字列
-
C++で数列 0, 0, 2, 1, 4, 2, 6, 3, 8, 4 のN番目の項を求める方法
問題の概要この問題では、整数値Nが与えられ、次の数列のN番目の項を求めることが課題となります。0, 0, 2, 1, 4, 2, 6, 3, 8, 4, 10, 5, 12, 6, 14, 7, 16, 8, 18, 9, 20, 10…一見すると規則性が分かりにくい数列ですが、実は2つの異なる数列を交互に並べたものになっています。この構造を見抜くことが解法の鍵となります。入出力の例入力: N = 6出力: 2解法のアプローチ数列のN番目の項を求めるには、偶数番目の項と奇数番目の項に分けてそれぞれの規則を観察します。偶数番目の項の規則T(2) = 0T(4) = 1T(6) = 2T(8) =
-
C++で数列0、8、64、216、512、…のn番目の項を求める方法
この記事では、整数値 N が与えられたときに、次の数列の n 番目の項を求める方法を解説します。0, 8, 64, 216, 512, 1000, 1728, 2744…問題の例入力:N = 6出力:1000解法のアプローチ数列の n 番目の項を求めるには、まず数列のパターンを注意深く観察することが重要です。この数列は「偶数の3乗」で構成されており、最初の項が 0 になっています。つまり、数列は次のように分解できます。[0]3, [2]3, [4]3, [6]3, [8]3, [10]3…各項を一般化して確認してみましょう。T1 = [0]3 = [2×(1−1)]3T2 = [2]3 = [
-
C++で級数「9, 45, 243, 1377, …」の第N項を求める方法
この問題では、整数値 N が与えられます。私たちのタスクは、次の級数の第N項を求めることです。 9, 45, 243, 1377, 8019, … 問題の理解 まず、具体例を使って問題を確認しましょう。 入力 : N = 4 出力 : 1377 N = 4 の場合、級数の4番目の項である 1377 が出力されれば正解となります。 解法アプローチ この問題に対するシンプルな解法は、級数を観察して一般項(第N項の式)を導出することです。各項を注意深く観察すると、次のようなパターンが見えてきます。 (1n + 2n) × 3n 実際に検証してみましょう。 n = 1 の場合 : (11 + 21
-
C++で削除が必要な箱の数を求めるアルゴリズム
問題概要この問題では、各要素が箱の山(それぞれの高さは1単位)を表す配列 arr[] が与えられます。私たちの課題は、削除する必要がある箱の数を求めることです。人は配列のインデックス0の位置に、その山の高さの地点に立っており、配列の末尾まで移動する必要があります。ある山から隣の山へ移動するには、ジャンプを行います。ジャンプが許されるのは、次の山の高さが現在と同じか、それより低い場合のみです。もし次の山の方が高ければ、高さが揃うまでその山から箱を取り除かなければなりません。つまり、先頭の山から最後の山まで移動する過程で取り除く箱の総数を求めるのが目的です。例を使って問題を理解しましょう。入力 :
-
C++でq回の範囲更新操作を適用した後の配列内の異なる値の個数を求める方法
問題概要 この問題では、すべての要素が0で初期化されたサイズNの配列と、次の形式のQ個のクエリが与えられます。 update(s, e, val) → インデックスsからe(両端を含む)までのすべての要素をvalに更新するクエリです。 私たちのタスクは、指定された操作をq回適用した後の配列に含まれる異なる値の個数を求めることです。 例を使って問題を理解しましょう。 入力 : N = 6, Q = 2 Q1 = update(1, 4, 3) Q2 = update(0, 2, 4) 出力 : 3 説明 初期配列:arr[] = {0, 0, 0, 0, 0, 0} クエリ1:update(1
-
C++で1〜nの範囲にあるすべての数の約数の個数を求める方法
この問題では、整数Nが与えられ、1からnまでの範囲に含まれるすべての数について、それぞれの約数の個数を求めることが課題となります。問題の例具体例を見てみましょう。入力 : N = 7出力 : 1 2 2 3 2 4 2N = 7の場合、1の約数は「1」の1個、2の約数は「1, 2」の2個、3の約数は「1, 3」の2個、4の約数は「1, 2, 4」の3個…というように、各数の約数の個数を順に出力します。解法アプローチ1:各数ごとに約数を数える方法最もシンプルな解法は、1からNまでの各数に対して、実際に割り切れる数を順番にカウントしていく方法です。各数iについて、2からiまでの値で順に割りを試し、
-
C++で配列内のプレフィックス(接頭辞)の最大出現回数を求める方法
この問題では、すべて小文字から構成される文字配列が与えられます。私たちのタスクは、配列内で最も多く出現するプレフィックス(接頭辞)を見つけることです。具体的には、出現回数が最大となる空でないプレフィックスについて、その出現回数を数える必要があります。問題を理解するための例入力 : string = xyyzkxyyzk 出力 : 2解法のアプローチこの問題の鍵となるのは、次のシンプルな発想です。配列のプレフィックスは必ず文字列の最初の文字を含みます。繰り返し出現するプレフィックスも同様に、必ず先頭の文字を持っています。また、文字列の最初の文字そのものは、文字数が1だけの最短のプレフィックスです
-
C++で変更後の配列の最小値が取りうる最大値を求める方法
問題概要 この問題では、サイズnの配列arr[]と数値Sが与えられ、変更後の配列における最小値の最大可能値を求めます。 配列を変更する際には、以下のルールが適用されます。 変更前と変更後の配列要素の合計の差は、ちょうどSでなければならない 変更後の配列に負の値は許されない 変更後の配列の最小値を最大化する必要がある 配列の変更は、任意の要素を増加または減少させることによって行える これらの制約のもとで新しい配列を構成し、その中で最小となる要素の値が最大になるようにします。 例を使って問題を理解しましょう。 入力 : arr[] = {4, 5, 6} S = 2 出力 : 4 説明 この場
-
C++でグラフの順列における最大値を求めるアルゴリズム
問題概要 この問題では、N個のノードからなるグラフが与えられます。私たちのタスクは、変更後の配列の最小値として考えられる最大値を見つけることです。 グラフに対してはノードの順列を考えます。この順列は、各ノードの左側に少なくとも1つ、共通の辺(エッジ)を共有するノードが存在するという条件のもとで、誘導される部分グラフの数に対応します。 具体例で問題を確認してみましょう。 入力 : N = 4, edge = {{1, 2}, {2, 3}, {3, 4}, {4, 1}} 出力 : 3 この例では、4つのノードが環状につながっているため、全体が1つの連結成分となり、答えは「連結成分のサイズ −
-
C++でソート順のN番目のバイナリ文字列を効率的に求める方法
問題概要 この問題では、正の整数Nが与えられます。記号「a」と「b」のみを使用して生成できる無限の文字列リストを辞書順(辞書式順序)に並べたとき、そのN番目の文字列を見つけることが課題です。 文字列のリストは以下のように並んでいます。 a, b, aa, ab, ba, bb, aaa, aab, aba, … 例で問題を理解する 入力:N = 8 出力:aab 解法アプローチ 最も単純な解決策は、ループを使って文字列を先頭から順にすべて生成し、N番目の文字列を返す方法です。この方法でも正しい結果は得られますが、Nが大きな値になる場合には計算コストが膨大になり、効率的な解とは言えません。 そこ