剑指offer之面试题38数字在排序数组中出现的次数

问题描述

统计一个数字在排序数组中出现的次数。

例如:

输入排序数组{1,2,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。

实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>

int findLastK(int *num,int left,int right,int len,int k){
	if(left>right){
		return -1;
	}
	int mid = (left+right)/2;
	int middate =num[mid];
	
	if(middate==k){
		if((mid<len && num[mid+1]!=k) || mid == len){
			return mid;
		}else{
			left = mid+1;
		}
	}else if(middate>k){
		right=mid-1;
	}else if(middate<k){
		left=mid+1;
	}
	return findLastK(num,left,right,len,k);
}

int findFirstK(int *num,int left,int right,int len,int k){
	if(left>right){
		return -1;
	}
	int mid = (left+right)/2;
	int middate =num[mid];
	
	if(middate==k){
		if((mid>0 && num[mid-1]!=k) || mid == 0){
			return mid;
		}else{
			right = mid-1;
		}
	}else if(middate>k){
		right=mid-1;
	}else if(middate<k){
		left=mid+1;
	}
	return findFirstK(num,left,right,len,k);
}


int getNumberOfK(int *num,int len,int k){
	int rs = 0;
	if(num!=NULL && len >0){
		int last =findLastK(num,0,len-1,len,k);
		int first=findFirstK(num,0,len-1,len,k);
		if(last>-1 && first>-1){
			rs = last -first+1;
		}
	}
	return rs;
}

int main(int argc, char *argv[])
{
	int num[]={
		1,2,3,3,3,3,4
	};
	int k ;
	scanf("%d",&k);
	int len = sizeof(num)/sizeof(int);
	int rs =getNumberOfK(num,len,k);
	printf("%d\n",rs);
	return 0;
}

参考资料
剑指offer

备注
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/51383949
作者:WSYW126

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值