【九度】题目1349:数字在排序数组中出现的次数
来源:互联网 发布:商品与条形码数据库 编辑:程序博客网 时间:2024/04/27 01:51
- 题目1349:数字在排序数组中出现的次数【解题思路】
时间限制:1 秒内存限制:32 兆特殊判题:否提交:1385解决:405题目描述:统计一个数字在排序数组中出现的次数。输入:每个测试案例包括两行:第一行有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答疑:解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-8072-1-1.html
数组的巧妙运用。
依然是值当做另外一个数组的下标。
这种应用只能是输入全部为正值的时候。
另外声明的时候,数组要开大一些。
其他没什么了。应用还蛮多。
Java使用二分查找去做的,因为数组是有序的。
Java也用了数组去做,发现不管是内存消耗还是时间消耗,二分查找都要相对快一些。
C++ AC
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int maxn = 1000002;int array[maxn]; int n,m,i; int main(){ while(scanf("%d",&n) != EOF){ int num; memset(array,0,sizeof(array)); for(i = 0; i < n; i++){ scanf("%d",&num); array[num]++; } scanf("%d",&m); for(i = 0; i < m; i++){ scanf("%d",&num); printf("%d\n",array[num]); } } return 0;}/************************************************************** Problem: 1349 User: wangzhenqing Language: C++ Result: Accepted Time:830 ms Memory:4928 kb****************************************************************/
Java AC 数组运用
import java.io.StreamTokenizer; public class Main { /* * 1431 */ public static void main(String[] args) throws Exception { StreamTokenizer st = new StreamTokenizer(System.in); while (st.nextToken() != StreamTokenizer.TT_EOF) { int n = (int) st.nval; int numCountArr[] = new int[2000000]; int array[] = new int[n]; for (int i = 0; i < n; i++) { st.nextToken(); array[i] = (int) st.nval; numCountArr[array[i]]++; } st.nextToken(); int m = (int) st.nval; for (int i = 0; i < m; i++) { st.nextToken(); int queryNum = (int) st.nval; System.out.println(numCountArr[queryNum]); } } }}/************************************************************** Problem: 1349 User: wzqwsrf Language: Java Result: Accepted Time:2130 ms Memory:177104 kb****************************************************************/
Java AC
import java.io.StreamTokenizer; public class Main { /* * 1349 * 这是一个已经排好序的序列。根据2分查找法,找到查询数字出现的开头和结尾。 * 结尾-开头+1即为个数。 */ public static void main(String[] args) throws Exception { StreamTokenizer st = new StreamTokenizer(System.in); while (st.nextToken() != StreamTokenizer.TT_EOF) { int n = (int) st.nval; int array[] = new int[n]; for (int i = 0; i < n; i++) { st.nextToken(); array[i] = (int) st.nval; } st.nextToken(); int m = (int) st.nval; for (int i = 0; i < m; i++) { st.nextToken(); int queryNum = (int) st.nval; int result = getNumCount(array ,queryNum); System.out.println(result); } } } private static int getNumCount(int[] array, int queryNum) { int begin = findNumBegin(array ,queryNum); int end = findNumEnd(array ,queryNum); if (begin > -1 && end > -1){ return (end - begin + 1); } return 0; } private static int findNumBegin(int[] array, int queryNum) { int low = 0; int high = array.length-1; while (low <= high) { int middle = (low + high ) / 2; if (array[middle] < queryNum) { low = middle + 1; }else if (array[middle] == queryNum) { if (middle == 0 || array[middle - 1] != queryNum) { return middle; }else { high = middle - 1; } }else { high = middle - 1; } } return -1; } private static int findNumEnd(int[] array, int queryNum) { int low = 0; int high = array.length - 1; while (low <= high) { int middle = (low + high ) / 2; if (array[middle] < queryNum) { low = middle + 1; }else if (array[middle] == queryNum) { if ( middle == high ||(middle < high && array[middle + 1] != queryNum) ){ return middle; }else { low = middle + 1; } }else { high = middle - 1; } } return -1; }}/************************************************************** Problem: 1349 User: wzqwsrf Language: Java Result: Accepted Time:1680 ms Memory:23852 kb****************************************************************/
- 题目1349:数字在排序数组中出现的次数-九度
- 【九度】题目1349:数字在排序数组中出现的次数
- 九度 题目1349:数字在排序数组中出现的次数
- 九度_题目1349:数字在排序数组中出现的次数
- [九度oj]题目1349:数字在排序数组中出现的次数
- 九度OJ-题目1349:数字在排序数组中出现的次数
- [九度OnlineJudge][剑指Offer]题目1349:数字在排序数组中出现的次数
- 九度 题目1349:数字在排序数组中出现的次数
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
- 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)
- 九度笔记之 1349:数字在排序数组中出现的次数
- 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找
- 九度oj 1349 数字在排序数组中出现的次数
- 算法题目---数字在排序数组中出现的次数
- 题目1370:数组中出现次数超过一半的数字-九度
- 九度 题目1370:数组中出现次数超过一半的数字
- 九度_题目1370:数组中出现次数超过一半的数字
- [九度oj]题目1370:数组中出现次数超过一半的数字
- C指针原理(2)
- java 和javaw 的区别
- 让世界听到你的声音---------如何快速建造一个好看的个人博客
- 各种分布式文件系统简介
- LLDB vs GDB
- 【九度】题目1349:数字在排序数组中出现的次数
- dojo SplitContainer
- Exception Counter v0.1 beta使用方法
- HTML 标准模板
- 日期比较
- IOS_改变UITextField placeHolder颜色、字体
- 字符串与整数的相互转换
- qml delegate内的一些问题
- MySQL 的一次错误处理 Got fatal error 1236 from master when reading data from binary log