二分:
利用二分查找字符串中第一个出现x的元素,也可以用STL lower_bound(a,a+n,x)-a可以输出字符串a中第一个出现x的下标;
#include<cstdio>
using namespace std;
int n,m,q,a[1000005];
int find(int x) //二分查找
{
int l=1,r=n;
while (l<r)
{
int mid=l+(r-l)/2;
if (a[mid]>=x) r=mid;
else l=mid+1;
}
if (a[l]==x) return l; //找都了就输出他的位置
else return -1; // 没找到输出-1
}
int main()
{
scanf("%d %d",&n,&m); //读入
for (int i=1 ; i<=n ; i++)
scanf("%d",&a[i]); //还是读入
for (int i=1 ; i<=m ; i++)
{
scanf("%d",&q);
int ans=find(q); //看看查找的结果
printf("%d ",ans); //输出
}
return 0;
}
链表用法:
//不带头节点链表: 第一个头结点head可以存储数据,但是插入和删除结点操作复杂
//带头结点链表:第一个头节点head不存储数据,
//所以我们通常都写带头结点链表
#include<iostream>
using namespace std;
struct node{
int a;
node *next;
};
//带头节点的链表
int main(){
node *head=new node;//为头节点开辟内存空间,方便从头查找
node *p=head;//指针p指向头节点head
//p->a=99; 若不带头结点
for(int i=1;i<10;i++){
node *t=new node; //开辟临时变量t
t->a=i;
p->next=t; //指针p往后移动
p=p->next;
p->next=NULL;
// t->next=NULL;
// p->next=t;
// p=t; 可代替上面三行代码
}
for(p=head->next;p;p=p->next){ // for(p=head;p;p=p->next)//若不带头节点
cout<<p->a<<" ";
}
return 0;
}