C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で組み込み関数を使わずに配列内の欠損している数と重複している数を見つける方法

欠損している数を見つける方法

まず、元の配列よりも1つ大きいサイズのbool型配列を新しく作成します。次に、元の配列全体を走査し、各数値が出現したら新しく作成した配列の対応するインデックスを true に設定していきます。すべての走査が完了した後、この配列を先頭から再度走査し、最初に false となっているインデックスが欠損している数となります。

重複している数を見つける方法

同様に、int型のカウント用配列を別途用意します。各数値の出現状況を記録し、同じ数が2回目に出現した時点でその位置の値を2に更新します。走査後、最初に値が2になっているインデックスが、重複している数を示します。

サンプルコード

using System;
namespace ConsoleApplication{
    public class Arrays{
        public void MissingNumberAndRepeatedNumber(int[] arr){
            bool[] tempArray = new bool[arr.Length + 1];
            int missingelement = -1;
            int repeatingelement = -1;

            // 各数値の出現をマークする
            for (int i = 0; i < arr.Length; i++){
                int index = arr[i];
                if (!tempArray[index]){
                    tempArray[index] = true;
                }
            }

            // 最初のfalseが欠損している数
            for (int i = 0; i < tempArray.Length; i++){
                if (!tempArray[i]){
                    missingelement = i;
                    break;
                }
            }

            // 出現回数をカウントする
            int[] tempArray1 = new int[arr.Length + 1];
            for (int i = 0; i < arr.Length; i++){
                int index = arr[i];
                if (tempArray1[index] == 0){
                    tempArray1[index] = 1;
                }else if (tempArray1[index] == 1){
                    tempArray1[index] = 2;
                }
            }

            // 最初の2が重複している数
            for (int i = 0; i < tempArray1.Length; i++){
                if (tempArray1[i] == 2){
                    repeatingelement = i;
                    break;
                }
            }

            Console.WriteLine(missingelement);
            Console.WriteLine(repeatingelement);
        }
    }

    class Program{
        static void Main(string[] args){
            Arrays a = new Arrays();
            int[] arr = { 0, 1, 1, 3, 4 };
            a.MissingNumberAndRepeatedNumber(arr);
            Console.ReadLine();
        }
    }
}

実行結果

2
1

アルゴリズムのポイント

この手法はLINQなどの組み込み関数に一切依存せず、シンプルなループ処理だけで実装できます。時間計算量はO(n)、空間計算量はO(n)であり、非常に効率的です。ただし、配列の要素が0からnまでの範囲に収まっていることが前提となるため、インデックスとして直接アクセスできる点に注意してください。上記の例では、配列 { 0, 1, 1, 3, 4 } の中で「2」が欠損しており、「1」が重複していることが正しく検出されています。

  1. C#で配列の次元数を取得する方法

    C#で配列の次元数を調べたい場合は、Rankプロパティを使用します。このプロパティは、配列の次元(ランク)を整数値として返します。arr.Rankここで、arrは対象となる配列です。例えば、以下のように2次元配列を宣言した場合:int[] arr = new int[3,4];さらに、配列の行数や列数といった各次元のサイズを取得したい場合は、GetLengthメソッドを使用します。arr.GetLength(0); // 第1次元のサイズ(行数) arr.GetLength(1); // 第2次元のサイズ(列数)サンプルコード以下に、RankプロパティとGetLengthメソッドを使った完全な

  2. Excelで数値の立方(3乗)と立方根を求める方法

    立方(3乗)や立方根の計算には、実生活において多くの活用場面があります。さまざまな数学的関数の基礎となるだけでなく、容器の体積を見積もる際にも欠かせない計算です。Excelで特定のセル、またはセル範囲に入力された数値の立方と立方根を求めたい場合は、この記事の手順を参考にしてください。 残念ながら、Excelには立方や立方根を直接求めるための専用関数は用意されていません。しかし、べき乗演算子「^」を使った指数計算を利用すれば、誰でも簡単に求めることができます。これが最も手軽な方法です。 Excelで立方(3乗)を求める方法 Excelである数値の立方を求める場合、数式の基本構文は次のとおりです。