C++程式:在陣列中搜索特定值


假設我們得到一個名為'arr'的陣列,其中包含n個已排序的整數值。我們還得到一個大小為q的陣列'query',我們需要判斷'query'中的值是否出現在給定的陣列'arr'中。如果'query'中的值在'arr'中存在,則輸出"Present"以及該值在陣列中的位置。否則,輸出"Not present"以及'arr'中大於'query'中該值的最小值的位置。請記住,陣列從1開始索引。

例如,如果輸入為 n = 8,arr = {1, 2, 3, 4, 7, 9, 12, 15},q = 3,query = {1, 5, 8},則輸出為:

Present 1
Not present 5
Not present 6

查詢的第一個值在arr的第1個位置。

查詢的第二個值不在arr中。大於該值的最小值位於arr的第5個位置。

同樣,查詢的第三個值也不在arr中。大於該值的最小值位於arr的第6個位置。

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個數組values
  • 迴圈,i 從0開始,當 i < n 時,執行以下操作 (i 自增):
    • 將arr[i]插入到values陣列的末尾
  • 迴圈,i 從0開始,當 i < q 時,執行以下操作 (i 自增):
    • idx := (values中第一個不小於query[i]的元素的位置) - (values中第一個元素的位置)
    • 如果 values[idx] 等於 query[i],則:
      • 輸出 "Present "
    • 否則:
      • 輸出 "Not present "
    • 輸出 (idx + 1)

示例

讓我們看下面的實現來更好地理解:

#include <vector>
#include <iostream>
using namespace std;

void solve(int n, int arr[], int q, int query[]) {
   vector<int> values;
   for(int i = 0; i < n; i++){
      values.push_back(arr[i]);
   }
   for(int i = 0; i < q; i++) {
      int idx = lower_bound (values.begin(), values.end(),
      query[i]) - values.begin();
      if (values[idx] == query[i])
         cout << "Present ";
      else
         cout << "Not present ";
      cout << idx + 1 << endl;
   }
}
int main() {
   int input_arr[] = {1, 2, 3, 4, 7, 9, 12, 15};
   int query_arr[] = {1, 5, 8};
   solve(8, input_arr, 3, query_arr);
   return 0;
}

輸入(stdin)

int input_arr[] = {1, 2, 3, 4, 7, 9, 12, 15};
int query_arr[] = {1, 5, 8};
solve(8, input_arr, 3, query_arr);

輸出

Present 1
Not present 5
Not present 6

更新於: 2021年10月11日

4K+ 閱讀量

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告