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

C++で0と1のソートされた配列で最初の1のインデックスを検索します


この問題では、ブール値(0と1のみ)で構成される配列bin[]がソートされた順序で与えられます。私たちのタスクは、0と1の並べ替えられた配列で最初の1のインデックスを見つけることです

問題を理解するために例を見てみましょう

Input : bin[] = {0, 0, 0, 1, 1}
Output : 3

説明

First 1 of the binary array is encountered at index 3.

ソリューションアプローチ

この問題を解決するには、基本的に配列内の最初の1のインデックスを見つける必要があります。そのために、検索手法を使用できます。

1つのアプローチは、線形検索を使用することです。インデックス0から配列の最後まで配列をトラバースします。そして、配列の最初の1のインデックスを返します。それ以外の場合は、-1を出力します。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
double find1stOneInArray(int bin[], int n) {
   for (int i = 0; i < n; i++)
      if (bin[i] == 1)
         return i;
      return -1;
}
int main() {
   int bin[] = { 0, 0, 0, 1, 1, 1 };
   int n = sizeof(bin) / sizeof(bin[0]);
      cout<<"The index of 1st occurrence of 1 in array is "<<find1stOneInArray(bin,n);
      return 0;
}

出力

The index of 1st occurrence of 1 in array is 3

別の検索手法 使用できるのは、配列がソートされるときの二分探索です。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
double find1stOneInArray(int bin[], int n) {
   int low = 0;
   int high = (n - 1);
   int mid;
   while (low <= high) {
      mid = (low + high) / 2;
      if (bin[mid] == 1 && (mid == 0 || bin[mid - 1] == 0))
         return mid;
      else if (bin[mid] == 1)
         high = mid - 1;
      else
         low = mid + 1;
   }
   return -1;
}
int main() {
   int bin[] = { 0, 0, 0, 1, 1, 1, 1 };
   int n = sizeof(bin) / sizeof(bin[0]);
      cout<<"The index of 1st occurrence of 1 in array is "<<find1stOneInArray(bin,n);
   return 0;
}

出力

The index of 1st occurrence of 1 in array is 3

  1. 数値の配列の積の最初の桁を見つけるC++プログラム

    この記事では、指定された配列の要素の積の最初の桁を見つけるプログラムについて説明します。 たとえば、配列が与えられたとしましょう。 arr = {12, 5, 16} その場合、これらの要素の積は12 * 5 * 16 =960になります。したがって、結果、つまりこの場合の積の最初の桁は9になります。 例 #include <bits/stdc++.h> using namespace std; int calc_1digit(int arr[], int x) {    long long int prod = 1;    for(in

  2. 配列を分割して最初の部分を最後に追加するC++プログラム?

    ここでは、配列を分割する方法と、最後の位置で分割した後に最初の部分を追加する方法を説明します。配列の内容が{0、1、2、3、4、5、6、7、8、9}であるとします。このイントロを2つの部分にカットしたいと思います。最初の部分はインデックス0から3(分割サイズ4)で、2番目の部分は残りです。最後に最初の部分を追加すると、配列要素は次のようになります{4、5、6、7、8、9、0、1、2、3}。この問題を解決するために、このアルゴリズムに従います。 アルゴリズム splitArray(arr、n、k) begin    for i := 0 to k, do   &n