字典问题
给一个数组A和一个元素x,判断x是否在A中出现。如果出现,给出位
置。一种方法是先给A排序(附加记录每个元素的原始位置),然后二分查找x。
置。一种方法是先给A排序(附加记录每个元素的原始位置),然后二分查找x。
时间:2018.5.6;
算法能力:查找单个字符在输入中的位置;
缺点:如果出现多次不知道程序选取的是哪一个;
算法能力:查找单个字符在输入中的位置;
缺点:如果出现多次不知道程序选取的是哪一个;
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; struct node{ char a; int rank; };node s[1000]; bool com(node x,node y) { if(x.a>y.a)return 1; else return 0; } int main() { int i=1; while(scanf("%c",&s[i].a)!=EOF) { s[i].rank=i;i++; } cout<<i<<endl; sort(s+1,s+1+i,com); char p;cin>>p; int mid,l=1,r=i; /*for(int j=1;j<=i;j++)cout<<s[j].a;cout<<endl;*/ while(l<r) { mid=(l+r)/2; if(s[mid].a<p)r=mid-1; else l=mid+1; if(s[mid].a==p){cout<<"YES rank="<<s[mid].rank;return 0;} } cout<<"no"; }做法二:他人做法,没有排序,牺牲了时间复杂度能够找到第一次出现目标字符;
#include <stdio.h> #include <string.h> int main() { int c, i=0; char str[81]; while((c=getchar()) != '\n'){// 记录字符串 str[i] = (char) c; i++; } char search; scanf("%c", &search); //记录字符 int k = 0, flat = 0; //查找字符 while(k<i){ if(search == str[k]){ flat = 1; } if(flat){ printf("%c", str[k]); } k++; } if(!flat){ printf("Not found"); } }如何保证复杂度和准确呢?5.6日16:58