九度笔记之 1349:数字在排序数组中出现的次数
2013-08-05 15:52
429 查看
题目1349:数字在排序数组中出现的次数
时间限制:1 秒内存限制:32 兆
特殊判题:否
提交:919
解决:230
题目描述:统计一个数字在排序数组中出现的次数。输入:
每个测试案例包括两行:
第一行有1个整数n,表示数组的大小。1<=n <= 10^6。
第二行有n个整数,表示数组元素,每个元素均为int。
第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。
下面有m行,每行有一个整数k,表示要查询的数。
输出:
对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。
样例输入:
81 2 3 3 3 3 4 513
样例输出:
4
算法分析
利用二分查找,分别查找某个数字在数组中第一次出现的位置和最后一次出现的位置。源程序
输入输入还是要用 scanf,printf同时要考虑数组只有一个数的情况
但是还有一个通不过,不知道为什么
//============================================================================ // Name : judo1349.cpp // Author : wdy // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ //bisearch #include <iostream> #include <stdio.h> using namespace std; int num[1000001] = {0}; void init(int n){ for(int i = 0;i<n;i++) scanf("%d",num+i);; } int findL(int b,int e,int value){ if(b==e && value == num[0]) return 1; if(b==e && value != num[0]) return -1; int bid = b; int eid = e; int mid = bid + ((eid-bid)>>1); while(bid<eid-1){ mid = bid + ((eid-bid)>>1); if(num[mid]>= value) eid = mid; else bid = mid; } if(num[bid]==value) return bid; else if(num[eid]==value) return eid; else return -1;//not found } int findR(int b,int e,int value){ if(b==e && value == num[0]) return 1; if(b==e && value != num[0]) return -1; int bid = b; int eid = e; int mid = bid + ((eid-bid)>>1); while(bid<eid-1){ mid = bid + ((eid-bid)>>1); if(num[mid]<= value) bid = mid; else eid = mid; } if(num[eid]==value) return eid; else if(num[bid]==value) return bid; else return -1;// not found } void test(){ num[0] = 1; num[1] = 1; num[2] = 1; num[3] = 3; num[4] = 3; std::cout<<"L"<<findL(3,4,4)<<std::endl; std::cout<<"R"<<findR(3,4,4)<<std::endl; } void findValue(int b,int e,int value){ std::cout<<findR(b,e,value)-findL(b,e,value)+1<<std::endl; } void judo(){ int n; int m; int value; while(scanf("%d",&n) != EOF){ init(n); scanf("%d",&m); while(m>0){ scanf("%d",&value); findValue(0,n-1,value); m--; } } } int main() { //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! judo(); return 0; } /************************************************************** Problem: 1349 User: KES Language: C++ Result: Wrong Answer ****************************************************************/
找到问题了,要考虑找不到的返回0
//============================================================================ // Name : judo1349.cpp // Author : wdy // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ //bisearch #include <iostream> #include <stdio.h> using namespace std; int num[1000001] = {0}; void init(int n){ for(int i = 0;i<n;i++) scanf("%d",num+i);; } int findL(int b,int e,int value){ if(b==e && value == num[0]) return 1; if(b==e && value != num[0]) return -1; int bid = b; int eid = e; int mid = bid + ((eid-bid)>>1); while(bid<eid-1){ mid = bid + ((eid-bid)>>1); if(num[mid]>= value) eid = mid; else bid = mid; } if(num[bid]==value) return bid; else if(num[eid]==value) return eid; else return -1;//not found } int findR(int b,int e,int value){ if(b==e && value == num[0]) return 1; if(b==e && value != num[0]) return -1; int bid = b; int eid = e; int mid = bid + ((eid-bid)>>1); while(bid<eid-1){ mid = bid + ((eid-bid)>>1); if(num[mid]<= value) bid = mid; else eid = mid; } if(num[eid]==value) return eid; else if(num[bid]==value) return bid; else return -1;// not found } void test(){ num[0] = 1; num[1] = 1; num[2] = 1; num[3] = 3; num[4] = 3; std::cout<<"L"<<findL(3,4,4)<<std::endl; std::cout<<"R"<<findR(3,4,4)<<std::endl; } void findValue(int b,int e,int value){ int R = findR(b,e,value); int L = findL(b,e,value); if( R>0) std::cout<<R-L+1<<std::endl; else std::cout<<0<<std::endl; } void judo(){ int n; int m; int value; while(scanf("%d",&n) != EOF){ init(n); scanf("%d",&m); while(m>0){ scanf("%d",&value); findValue(0,n-1,value); m--; } } } int main() { //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! judo(); return 0; } /************************************************************** Problem: 1349 User: KES Language: C++ Result: Wrong Answer ****************************************************************/
结果
相关文章推荐
- 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)
- 九度 题目1349:数字在排序数组中出现的次数
- 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)
- 题目1349:数字在排序数组中出现的次数-九度
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
- 九度 题目1349:数字在排序数组中出现的次数
- 九度 1349 数字在排序数组中出现的次数
- 【九度】题目1349:数字在排序数组中出现的次数
- [九度oj]题目1349:数字在排序数组中出现的次数
- 剑指Offer - 九度1349 - 数字在排序数组中出现的次数
- [九度OnlineJudge][剑指Offer]题目1349:数字在排序数组中出现的次数
- 九度_题目1349:数字在排序数组中出现的次数
- 九度oj 1349 数字在排序数组中出现的次数
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
- 九度OJ-题目1349:数字在排序数组中出现的次数
- 《剑指Offer》学习笔记--面试题38:数字在排序数组中出现的次数
- 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找
- 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找
- 数据结构与算法分析笔记与总结(java实现)--数组9:数字在排序数组中出现的次数
- 剑指offer_数组---数字在排序数组中出现的次数