题目:
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。 第三行包含一个整数a,为待查找的数。 输出格式 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。 样例输入 6 1 9 4 8 3 9 9 样例输出 2 数据规模与约定 1 <= n <= 1000。
代码:
#include <iostream> #include <cstdio> using namespace std; int main() { int n,a[1000]={0},s,f; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&s); if(a[s]==0) //因为找的是第一次出现的位置所以如果先前放过了就不再放了 a[s] = i; } scanf("%d",&f); if(a[f]!=0) //判断是否放入进入,如果没有放入进去就输出-1 cout<<a[f]; else cout<<-1<<endl; return 0; }
注意点:
1.本来呢想先读入数据,再进行排序,然后在二分查找什么,后来看了下数据量1000,那么可以采用空间换取时间,将每个读入的数作为下标,里面的数保存第n个位置,最后直接读取下标即可
2.如果有重复的数,那么输出第一次出现的数,所以这里要设一个条件:有重复的后面就不再放入
3.还要注意的是如果没有该数,就要返回-1