查找or插入

给定一个有序(升序)数字数组A,查找数字target,若target在数组中出现,返回位置,若不存在,返回它应该插入的位置

Input

多组输入。
每组输入第一行输入两个整数n,m,分别代表数组长度和询问次数;
第二行输入n个整数,为数字A的所以元素,数据保证没有重复元素;
接下来的m行,每行一个正整数表示询问的target。

Output

若target在数组中出现,输出taeget的位置,若不存在,输出它应该插入的位置。

Example Input
4 2
1 2 3 4
2
0
Example Output

2
1

二分查找谁都会用,那如果查找不到,怎样知道它该插入哪个位置呢? 其实只要对二分查找的实现过程观察分析就可知,当查找无果时,left 就是插入位置~

#include <stdio.h>
#include <stdlib.h>
#define N 100010

int a[N];
int Binsearch(int left,int right,int key)
{
	int i=left,j=right,mid;
	if(i<=j)
	{
		mid=(i+j)/2;
		if(a[mid]==key)
			return mid;
		if(a[mid]>key)
			return Binsearch(left,mid-1,key);
		else
			return Binsearch(mid+1,right,key);
	}
	return left;
}
int main()
{
	int n,m;
	int i,target;
	while(~scanf("%d%d",&n,&m))
	{
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		while(m--)
		{
			scanf("%d",&target);
			printf("%d\n",Binsearch(1,n,target));
		}
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用数组来实现顺序表,基本操作包括查找插入、删除。 查找:遍历数组,找到目标元素的位置,返回该位置或者返回未找到的标志。 插入:先判断数组是否已满,若未满,则将插入位置后的元素依次后移一位,再将新元素插入到指定位置。 删除:先判断数组是否为空,若不为空,则将删除位置后的元素依次前移一位,再将最后一个元素删除。 需要注意的是,插入和删除操作会改变数组的长度,需要及时更新数组的长度信息。 ### 回答2: 顺序表是一种线性表的实现方式,它在内存中使用连续的存储空间来存储数据元素,并且元素之间的顺序是固定的。 要实现顺序表的基本操作,首先需要定义一个顺序表的结构体,包括数据元素的数组和当前元素个数。如下所示: ```c #define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int length; } SeqList; ``` 接下来,我们就可以实现顺序表的基本操作。 1. 查找:顺序表的查找操作可以按照元素的值进行线性查找,遍历整个顺序表,找到匹配的元素并返回其位置。如下所示: ```c int search(SeqList list, int value) { for(int i = 0; i < list.length; i++) { if(list.data[i] == value) { return i; } } return -1; // 未找到,返回-1 } ``` 2. 插入:顺序表的插入操作需要将要插入位置后的元素均向后移动一个位置,并将插入元素放指定位置。如下所示: ```c void insert(SeqList *list, int position, int value) { if(position < 0 || position > list->length || list->length == MAX_SIZE) { // 位置不合法或顺序表已满,无法插入元素 return; } // 从位置 position 开始后移元素 for(int i = list->length; i > position; i--) { list->data[i] = list->data[i-1]; } // 将元素插入指定位置 list->data[position] = value; list->length++; } ``` 3. 删除:顺序表的删除操作需要将指定位置后的元素依次向前移动一个位置,覆盖要删除的元素。如下所示: ```c void delete(SeqList *list, int position) { if(position < 0 || position >= list->length) { // 位置不合法,无法删除元素 return; } // 从位置 position 开始前移元素 for(int i = position; i < list->length - 1; i++) { list->data[i] = list->data[i+1]; } list->length--; } ``` 通过以上的代码,我们实现了顺序表的基本操作:查找插入、删除。这些操作能够满足对顺序表的常见需求。需要注意的是,在插入和删除操作中需要处理边界情况,如插入位置超出了顺序表的长度或顺序表已满等情况。 ### 回答3: 顺序表是一种线性表的存储结构,可以使用数组来实现。基本操作包括查找插入和删除。 查找操作可以按照给定的元素值,从表头开始逐个元素进行比较,找到则返回该元素位置的索引;如果没有找到则返回-1。 插入操作可以在指定位置插入一个新的元素。首先判断插入位置是否有效,然后将插入位置后的元素依次后移一位,将新元素插入到指定位置。 删除操作可以删除指定位置的元素。首先判断删除位置是否有效,然后将删除位置后的元素依次前移一位,将被删除的元素覆盖掉。 以下是一个基本操作的示例代码: ```python class SeqList: def __init__(self): self.data = [] # 用来存储元素的列表 def search(self, elem): for i in range(len(self.data)): if self.data[i] == elem: return i return -1 def insert(self, index, elem): if index < 0 or index > len(self.data): return False self.data.insert(index, elem) return True def delete(self, index): if index < 0 or index >= len(self.data): return False del self.data[index] return True ``` 这段代码定义了一个SeqList类,包含了查找插入和删除操作的方法。使用时可以根据需要创建实例并调用这些方法实现对顺序表的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值