九度笔记之 1349:数字在排序数组中出现的次数
来源:互联网 发布:php序列化和反序列化 编辑:程序博客网 时间:2024/04/19 08:49
题目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****************************************************************/
结果
- 九度笔记之 1349:数字在排序数组中出现的次数
- 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)
- 题目1349:数字在排序数组中出现的次数-九度
- 【九度】题目1349:数字在排序数组中出现的次数
- 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找
- 九度 题目1349:数字在排序数组中出现的次数
- 九度_题目1349:数字在排序数组中出现的次数
- [九度oj]题目1349:数字在排序数组中出现的次数
- 九度oj 1349 数字在排序数组中出现的次数
- 九度OJ-题目1349:数字在排序数组中出现的次数
- [九度OnlineJudge][剑指Offer]题目1349:数字在排序数组中出现的次数
- 九度 题目1349:数字在排序数组中出现的次数
- 牛客网刷题之数字在排序数组中出现的次数
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
- 【数组8】数字在排序数组中出现的次数
- 【数组4】数字在排序数组中出现的次数
- 数组9:数字在排序数组中出现的次数
- 数字在排序数组中出现的次数(数组)
- 从细节处剖析 教你登顶新浪微博
- APUE读书笔记-第13章-守护进程
- pcDuino安装vnc进行远程控制
- 单实例数据库迁移到rac环境(二)
- iOS应用内支付(IAP)的那些坑
- 九度笔记之 1349:数字在排序数组中出现的次数
- glib wpa_supplicant Unix上库编译错误解决与总结
- 如何使用TPTP中的IDatapool
- MFC为什么要安装_AfxCbtFilterHook钩子函数?
- android定制化开关机动画、铃音
- Sysfs_linux设备底层模型
- 利用百度贴吧进行网站优化的六个妙招
- oracle中exp,imp的使用详解
- 使用 python Matplotlib 库绘图