请帮我用c语言写这道题的代码:给定一个有序正整数数组和一个要查找的目标数。要求给出要查找目标数在给定数组中第一次(或最后一次)出现的索引号(数组下标),没有查找到时输出-1。
时间: 2023-06-08 20:03:44 浏览: 97
华为实习部分上机题解
好的,以下是代码:
```c
#include <stdio.h>
// 寻找第一次或最后一次出现的索引号
int binarySearch(int arr[], int n, int target, int isFirst) {
int left = 0, right = n - 1;
int ans = -1; // 初始化为-1,表示没找到
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) { // 找到目标数
ans = mid; // 更新答案
if (isFirst) { // 如果是寻找第一次出现的
right = mid - 1; // 向左移动右边界
} else { // 如果是寻找最后一次出现的
left = mid + 1; // 向右移动左边界
}
} else if (arr[mid] < target) { // 目标数在右半部分
left = mid + 1;
} else { // 目标数在左半部分
right = mid - 1;
}
}
return ans;
}
int main() {
int arr[] = {1, 2, 2, 2, 4, 5, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 2; // 要查找的目标数
int firstIndex = binarySearch(arr, n, target, 1); // 寻找第一次出现的索引号
int lastIndex = binarySearch(arr, n, target, 0); // 寻找最后一次出现的索引号
printf("第一次出现的索引号: %d\n", firstIndex);
printf("最后一次出现的索引号: %d\n", lastIndex);
return 0;
}
```
该代码中,`binarySearch` 函数使用二分查找法,在有序数组中寻找目标数第一次(或最后一次)出现的索引号。函数参数 `isFirst` 为布尔值,表示是否寻找第一次出现的索引号。如果该值为 `true`,则向左移动右边界,否则向右移动左边界。
在主函数中,我们先声明一个有序正整数数组 `arr` 和要查找的目标数 `target`,然后分别调用 `binarySearch` 函数,寻找第一次和最后一次出现的索引号,最后输出结果。
注意,该代码假设输入的数组已经有序。如果数组无序,需要先进行排序操作。
阅读全文