思路:

二分法,分别找出第一个和最后一个k出现的位置。相减 加一

#include <stdio.h>

//获取第一个K的位置
int getFirstK (int k,int *numbers,int start,int end){ if(start > end){
return -;
} int middle = (start + end) / ;
int middleData = numbers[middle]; if(middleData < k){
start = middle + ;
}else if(middleData > k){
end = middle - ;
}else{
if(middle> && numbers[middle-]!=k    //注意这个if
|| middle==){
return middle;
}else{
end = middle -;
}
} getFirstK(k,numbers,start,end);
}

//获取最后一个K的位置
int getLastK (int k,int *numbers,int start,int end){ if(start > end){
return -;
} int middle = (start + end) / ;
int middleData = numbers[middle]; if(middleData < k){
start = middle + ;
}else if(middleData > k){
end = middle - ;
}else{
if(middle<end && numbers[middle+]!=k
|| middle==end){
return middle;
}else{
start = middle + ;
}
} getLastK(k,numbers,start,end);
} //得到k 在numbers中的个数
int getNumberOfK(int k, int* numbers,int length){
if(numbers == NULL || length <= ){
return ;
} int last = getLastK(k, numbers,, length-);
int first = getFirstK(k, numbers,, length-); if(last == - || first == -){
return ;
}
return last - first + ;
} int main(){ int numbers1[] = {,,,,,,,,,,,,,,,,,,,};
printf("%d\n",getNumberOfK(,numbers1,)); int numbers2[] = {,,,,,,,,,};
printf("%d\n",getNumberOfK(,numbers2,)); int* numbers3 = NULL;
printf("%d\n",getNumberOfK(,numbers3,)); }

剑指offer 38_统计数组中k出现的个数的更多相关文章

  1. 《剑指offer》旋转数组中的最小数字

    本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...

  2. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  3. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或

    剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...

  4. 【剑指Offer】旋转数组中的最小数字 解题报告(Python)

    [剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  5. 【剑指offer】03.数组中重复的数组

    剑指 Offer 03. 数组中重复的数字 知识点:数组:哈希表:萝卜占坑思想 题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些 ...

  6. [剑指Offer]53-在排序数组中查找数字(二分查找)

    题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这 ...

  7. 【剑指offer】数字数组中只出现一次(2)

    转载请注明出处:http://blog.csdn.net/mmc_maodun/article/details/27800577 题目:一个int数组中有三个数字a.b.c仅仅出现一次,其它数字都出现 ...

  8. 剑指 Offer 56 - II. 数组中数字出现的次数 II

    题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...

  9. 【剑指offer】73.数组中出现次数超过一半的数字

    73.数组中出现次数超过一半的数字 知识点:数组:哈希:占领地思想: 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4 ...

随机推荐

  1. SQL Server 2016 —— 聚集列存储索引的功能增强

    作者 Jonathan Allen,译者         邵思华         发布于     2015年6月14日   聚集列存储索引(CC Index)是SQL Server 2014中两大最引 ...

  2. spring: 使用profiles选择数据源(结合嵌入式数据源EmbeddedDatabaseBuilder)

    一般需要在不同的环境(日常环境.性能测试环境.预发环境和生产环境等等)中配置不同的数据源,例如,在开发时非常适合使用嵌入式数据源.在QA环境中比较适合使用DBCP的BasicDataSource.在生 ...

  3. java: Comparable比较器,定义二叉操作类

    //定义二叉操作类 class BinaryTree{ class Node{ private Node left; //左指数 private Node right; //右指数 private C ...

  4. 262. Trips and Users

    问题描述 解决方案 -- case when 的效率比if的效率高 -- select Trips.Request_at as 'Day', -- round(sum(case Trips.Statu ...

  5. Xcode 查找 TODO 清单

    在 Xcode 中按 Shift+Command+F,显示在项目中查找窗口,选择按正则表达式查找(Find > Regular Expression): TODO:  //\s*\bTODO\s ...

  6. Linux系统调用分析

    在HelloWorld程序中,我们可以调用libc中的getpid函数获取当前进程的进程号.HelloWorld是运行在用户空间,那么它是如何通过系统调用切换到内核空间来获取PID的呢?原来,在uni ...

  7. 条款52:谢了placement new 也就同时应该写一个placement delete

    如果operator new接收到的参数除了size_t之外还有其他的话,那么这个operator new实际上就是一个placement new,所以考虑下下面这样的情况: 一个可以用来记录信息的p ...

  8. EF中使用Linq的Lambda比较字符串格式日期大小

    在使用EF时,想要比较字符串类型的日期时,参考以下: SQL语句: 1)select * from TableName where StartTime > ‘2015-04-08‘ 2)sele ...

  9. 获得客户端ip

    获得客户端ip private function GetIP(){        if(!empty($_SERVER["HTTP_CLIENT_IP"])){          ...

  10. vector的内存分配机制分析

    该程序初步演示了我对vector在分配内存的时候的理解.可能有误差,随着理解的改变,改代码可以被修改. /* 功能说明: vector的内存分配机制分析. 代码说明: vector所管理的内存地址是连 ...