微软面试题:在排序数组中,找出给定数字的出现次数

解法:二分查找
评论:二分查找和排序在很多数值类的算法中应用广泛,基本上可以说,对这两个算法不熟练,会悲剧。上题可以扩展为:在一些无序的数字中查找某个数字出现的个数。扩展后的解法可以先进行排序,后面的解法同。排序则当然要用快排了。这个解法应该说就是一个令人满意的答案了。
找出给定数字的出现次数,比如 [1, 2, 2, 2, 3] 中2的出现次数是3次 

  1. #include <iostream>

  2. #include <string>

  3. #include <fstream>

  4. using namespace std;

  5. int count=0;

  6. void countNum(int a[],int start,int finish)

  7. {

  8.     //cout<<start<<" \n"<<finish<<"\n";

  9.     int middle=(start+finish)/2;

  10.     if(start>finish)

  11.       return ;

  12.     if(a[middle]==2)

  13.     {

  14.         count++;

  15.         countNum(a,start,middle-1);

  16.         countNum(a,middle+1,finish);

  17.         //cout<<"get here"<<middle<<endl;

  18.     }else if(a[middle]>2)

  19.     {

  20.         countNum(a,start,middle-1);

  21.     }else

  22.     {

  23.        countNum(a,middle+1,finish);

  24.     }

  25.     //return count;

  26. }

  27. int main()

  28. {



  29.     int s[1000];

  30.     ifstream inf("1.txt");

  31.     int i=0;

  32.     while(!inf.eof())

  33.         {inf>>s[i];i++;}



  34.     //int s[]={1,2,2,2,3};

  35.     int start=0;//,finish=NUM-1;

  36.     countNum(s,start,i-1);

  37.     cout<<count<<endl;



  38. }
复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值