Javaでソートされていない整数配列から欠落している正の数を見つける方法
はじめに
ソートされていない整数の配列が与えられていると仮定しましょう。この課題は、範囲 [0〜n] の中で、与えられた配列に存在しない正の欠損数を見つけることです。以下に具体例を示します。
入力例1
N = 9 arr = [0,2,5,9,1,7,4,3,6]
出力:
8
説明: このソートされていない配列において、「8」だけが欠落している正の整数であるため、出力は「8」になります。
入力例2
N = 1 arr = [0]
出力:
1
説明: この配列では、「1」だけが欠落している正の整数であるため、出力は「1」になります。
この問題へのアプローチ
この問題にはいくつかの解法がありますが、線形時間 O(n) かつ定数領域 O(1) で効率よく解くことができます。
配列のサイズは n であり、その要素はちょうど [0〜n] の範囲に収まっていることが分かっています。そこで、各要素とそのインデックス、さらに「n」を含めて XOR 演算を行うと、配列から欠落している一意の数を求めることができます。
これは XOR の性質によるものです。同じ値同士の XOR は 0 になり、すべての値を順に XOR していくと、ペアにならなかった値、すなわち欠損数だけが最後に残る仕組みです。
解法の手順
- [0〜n] の範囲の要素を含むサイズ N の配列を入力として受け取ります。
- 整数型関数 findMissingNumber(int arr[], int size) が、配列とそのサイズを引数として受け取り、欠損数を返します。
- 欠損数を格納する変数を初期化し(初期値は配列のサイズ n)、ここに対して XOR 演算を実行していきます。
- 配列の全要素を走査し、各要素とそのインデックスを欠損数候補に対して XOR 演算します。
- 最終的に残った値が欠損数となるため、それを返します。
実装例
public class Solution {
public static int findMissingNumber(int arr[], int size){
int missing_no= size;
for(int i=0;i<size;i++){
missing_no^= i^arr[i];
}
return missing_no;
}
public static void main(String[] args){
int arr[] = {0,4,2,1,6,3};
int n = arr.length;
int a=findMissingNumber(arr, n);
System.out.println(a);
}
}
出力
上記のコードを実行すると、次の出力が得られます。
5
与えられた配列 {0,4,2,1,6,3} では「5」が欠落しているため、プログラムは 5 を返します。
-
Javaで円の周囲(円周)を求めるプログラムの作成方法
この記事では、Javaを使って円の周囲(円周)を求める方法について解説します。円周とは、円の外周を1周したときの長さ、つまり円の境界線に沿った距離のことです。 円周の計算式 円周は次の公式で求められます。 C = 2πr ここで、π(パイ)は円周率(本記事では近似値として 22/7 ≒ 3.14 を使用)、r は円の半径を表します。 実行例 入力 入力値が次のとおりであるとします。 円の半径 : 5 出力 円の周囲は: 31.428571428571427 アルゴリズム ステップ1 - 開始 ステップ2 - double型の変数 my_radius と my_perimeter を宣言する
-
Javaで台形の面積を求めるプログラムの作成方法を解説
この記事では、Javaを使って台形(トラペジウム)の面積を求める方法について詳しく解説します。台形とは、少なくとも1組の対辺が互いに平行になっている四角形のことです。平行な2つの辺は「底辺」と呼ばれ、平行でない残りの2つの辺は「脚」と呼ばれます。英語圏では trapezoid(トラペゾイド)と呼ばれることもあります。 台形の面積は、次の公式を使って計算できます。 面積 = (高さ ÷ 2) × (上底 + 下底) すなわち、 面積 = ½ × (平行な2辺の長さの合計) × (平行な2辺間の垂直距離) 以下に具体的なイメージを示します。平行な2辺の長さを a、b、台形の高さを h としたとき