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+ 阅读量

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.