【c语言】统计一个数字在排序数组中出现的次数
2015-07-14 19:33
741 查看
// 题目:统计一个数字在排序数组中出现的次数。
// 例如:排序数组{1,2,3,3,3,3,4,5}和数字3,由于3出现了4次,因此输出4
有一种最简单的算法,遍历。但是有比它效率更高的
先看遍历:
还有一种利用二分查找:
// 例如:排序数组{1,2,3,3,3,3,4,5}和数字3,由于3出现了4次,因此输出4
有一种最简单的算法,遍历。但是有比它效率更高的
先看遍历:
#include <stdio.h> #include <assert.h> int num_time(int *arr, int len, int a) { int i = 0; int count = 0; assert(arr != NULL); for (; i < len; ++i) { if (arr[i] == a) count++; } return count; } int main() { int arr[] = { 1, 2, 3, 3, 3, 3, 4, 5 }; int len = sizeof(arr) / sizeof(arr[0]); printf("%d\n", num_time(arr, len, 3)); return 0; }
还有一种利用二分查找:
#include <stdio.h> int GetFirstKey(int arr[], int left, int right, int len, int key) { int mid; if (left > right) { return -1; } mid = left - (left - right) / 2; if (key == arr[mid]) { if ((mid > 0 && arr[mid - 1] != key) || mid == 0) { return mid; } else { right = mid - 1; } } else if (arr[mid] < key) { left = mid + 1; } else { right = mid - 1; } return GetFirstKey(arr, left, right, len, key); } int GetLastKey(int arr[], int left, int right, int len, int key) { int mid; if (left > right) { return -1; } mid = left - (left - right) / 2; if (key == arr[mid]) { if ((mid < len - 1 && arr[mid + 1] != key || mid == len - 1)) { return mid; } else { left = mid + 1; } } else if (arr[mid] < key) { left = mid + 1; } else { right = mid - 1; } return GetLastKey(arr, left, right, len, key); } int main() { int brr[] = { 1, 2, 3, 3, 3, 3, 4, 5}; int len = sizeof(brr) / sizeof(brr[0]); int first = GetFirstKey(brr, 0, len - 1, len - 1, 3); int last = GetLastKey(brr, 0, len - 1, len - 1, 3); printf("%d\n", last - first + 1); return 0; }
相关文章推荐
- C++时间获取
- 【Binary Search Tree Iterator 】cpp
- 『Luogu OJ』『C++』Level 1-1
- 重载赋值运算符(c/c++)
- c++11 右值引用与转移语义
- C++面试题四
- C++ 内存分配(new,operator new)详解
- C++生成和使用库文件
- 【Binary Tree Right Side View 】cpp
- C++中placement new操作符(经典)
- c++实现设计模式之适配器模式
- C语言的命名规范
- C/C++程序设计01(内存分配与管理,内存泄露处理)
- C++的运算符重载
- 你所不知道的C和C++运行库
- C++编译器与链接器工作原理
- C++ 语言的 15 个晦涩特性
- C语言运算符优先级 详细列表
- C++运算符优先级
- C++ socket与Flex as3通信的沙盒问题解决