ポジションを申請していたところ、コーディングの問題を完了するように依頼されました。私はそうし、それを提出しましたが、後で私はそのポジションから拒否されたことがわかりました。とにかく、私は折衷的なプログラミングの背景を持っているので、自分のコードがひどく間違っているのか、それともそこに最良の解決策がなかったのかはわかりません。私のコードを投稿し、それについていくつかのフィードバックを得たいと思います。その前に、問題の説明を次に示します。

You are given a sorted array of integers, say, c2020_0. Now you are supposed to write a program (in C or C++, but I chose C) that prompts the user for an element to search for. The program will then search for the element. If it is found, then it should return the first index the entry was found at and the number of instances of that element. If the element is not found, then it should return "not found" or something similar. Here's a simple run of it (with the array I just put up):

Enter a number to search for: 4 4 was found at index 2. There are 2 instances for 4 in the array. Enter a number to search for: -4. -4 is not in the array.

彼らは、私のコードは大規模な配列で適切にスケーリングする必要があるとコメントしました（そのため、バイナリ検索を作成しました）。とにかく、私のコードは基本的に次のように実行されます：

- ユーザーに入力を求めます。
- 次に、それが境界内にあるかどうかを確認します（配列のa [0]より大きく、配列の最大要素より小さい）。
- その場合、私は二分探索を実行します。
- 要素が見つかった場合、2つのwhileループを記述しました。1つのwhileループは、見つかった要素の左側にカウントされ、2番目のwhileループは、見つかった要素の右側にカウントされます。ループは、隣接する要素が目的の値と一致しない場合に終了します。

例：4、** 4 **、4、4、4

**太字の4 **は、バイナリ検索が到達した値です。1つのループはその左側をチェックし、別のループはその右側をチェックします。それらの合計は、数4のインスタンスの総数になります。

とにかく、欠けている高度なテクニックがあるのか、CSの背景がなくて大きなエラーを起こしただけなのかはわかりません。建設的な批評をいただければ幸いです！

```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
/* function prototype */
int get_num_of_ints(
const int* arr,
size_t r,
int N,
size_t* first,
size_t* count
);
int main()
{
int N; /* input variable */
int arr[]={1,1,2,3,3,4,4,4,4,5,5,7,7,7,7,8,8,8,9,11,12,12}; /* sorted */
size_t r = sizeof(arr)/sizeof(arr[0]); /* right bound */
size_t first; /* first match index */
size_t count; /* total number of matches */
/* prompts the user to enter input */
printf( "\nPlease input the integer you would like to find.\n" );
scanf( "%d", &N );
int a = get_num_of_ints( arr, r, N, &first, &count );
/* If the function returns -1 then the value is not found.
Else it is returned */
if( a == -1)
printf( "%d has not been found.\n", N );
else if(a >= 0){
printf( "The first matching index is %d.\n", first );
printf( "The total number of instances is %d.\n", count );
}
return 0;
}
/* function definition */
int get_num_of_ints(
const int* arr,
size_t r,
int N,
size_t* first,
size_t* count)
{
int lo=0; /* lower bound for search */
int m=0; /* middle value obtained */
int hi=r-1; /* upper bound for search */
int w=r-1; /* used as a fixed upper bound to calculate the number of
right instances of a particular value. */
/* binary search to find if a value exists */
/* first check if the element is out of bounds */
if( N < arr[0] || arr[hi] < N ){
m = -1;
}
else{ /* binary search to find value if it exists within given params */
while(lo <= hi){
m = (hi + lo)/2;
if(arr[m] < N)
lo = m+1;
else if(arr[m] > N)
hi = m-1;
else if(arr[m]==N){
m=m;
break;
}
}
if (lo > hi) /* if it doesn't we assign it -1 */
m = -1;
}
/* If the value is found, then we compute left and right instances of it */
if( m >= 0 ){
int j = m-1; /* starting with the first term to the left */
int L = 0; /* total number of left instances */
/* while loop computes total number of left instances */
while( j >= 0 && arr[j] == arr[m] ){
L++;
j--;
}
/* There are six possible outcomes of this. Depending on the outcome,
we must assign the first index variable accordingly */
if( j > 0 && L > 0 )
*first=j+1;
else if( j==0 && L==0)
*first=m;
else if( j > 0 && L==0 )
*first=m;
else if(j < 0 && L==0 )
*first=m;
else if( j < 0 && L > 0 )
*first=0;
else if( j=0 && L > 0 )
*first=j+1;
int h = m + 1; /* starting with the first term to the right */
int R = 0; /* total number of right instances */
/* while loop computes total number of right instances */
/* we fixed w earlier so that it's value does not change */
while( arr[h]==arr[m] && h <= w ){
R++;
h++;
}
*count = (R + L + 1); /* total num of instances stored into count */
return *first; /* first instance index stored here */
}
/* if value does not exist, then we return a negative value */
else if( m==-1)
return -1;
}
```