输入 n 个单调不减的(就是后面的数字不小于前面的数字)非负整数 ,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -c语言
时间: 2024-10-19 14:15:37 浏览: 16
为了实现这样的功能,你需要使用一个数据结构来存储这些单调不减的非负整数列表,同时维护一个有序数组来记录每个元素首次出现的位置。以下是使用C语言实现的一个简单解决方案,使用了哈希表(这里以动态数组模拟)和二分查找来高效地查询:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100000 // 根据实际情况调整最大数量
#define COUNTER_NOT_FOUND -1
typedef struct {
int num[MAX_N];
int firstAppearance[MAX_N]; // 存储每个元素首次出现的位置
int size;
} MonotonicList;
MonotonicList* initMonotonicList() {
MonotonicList *list = malloc(sizeof(MonotonicList));
list->size = 0;
return list;
}
void insert(MonotonicList *list, int num) {
if (list->size == MAX_N) {
printf("已达最大容量,无法插入更多元素。\n");
return;
}
// 如果num已存在,更新firstAppearance位置
for (int i = list->size; i > 0 && num >= list->num[i - 1]; i--) {
list->num[i] = list- 1];
}
list->num[i] = num;
list->firstAppearance[i] = list->size; // 插入位置
list->size++;
}
int searchFirstAppearance(MonotonicList *list, int query) {
int left = 0;
int right = list->size - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (query == list->num[mid]) {
return list->firstAppearance[mid];
} else if (query < list->num[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return COUNTER_NOT_FOUND; // 没有找到返回标记
}
int main() {
MonotonicList *list = initMonotonicList();
int n, q;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &list->num[i]);
insert(list, list->num[i]); // 先插入保证单调性
}
scanf("%d", &m);
for (int i = 0; i < m; i++) {
scanf("%d", &q);
int result = searchFirstAppearance(list, q);
if (result != COUNTER_NOT_FOUND) {
printf("数字 %d 的第一次出现位置为 %d.\n", q, result);
} else {
printf("数字 %d 没有在序列中出现过.\n", q);
}
}
free(list); // 别忘了释放内存
return 0;
}
阅读全文