数字在排序数组中出现的次数

简介:

题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.

 

找到排序数组中的第一个K:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int  GetFirstK( int  *data,  int  length,  int  k,  int  start,  int  end)
{
     if (start > end)
         return  -1;
     
     int  middleIndex = start + ((end - start) >> 1);
     int  middleData = data[middleIndex];
     
     if (middleData == k)
     {
         if ((middleIndex > 0 && data[middleIndex - 1] != k) || middleIndex == 0)
             return  middleIndex;
         else
             end = middleIndex - 1;
     }
     else  if (middleData > k)
         end = middleIndex - 1;
     else
         start = middleIndex + 1;
     
     return  GetFirstK(data, length, k, start, end);
}

 找到排序数组中最后一个k:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int  GetLastK( int  *data,  int  length,  int  k,  int  start,  int  end)
{
     if (start > end)
         return  -1;
     
     int  middleIndex = start + ((end - start) >> 1);
     int  middleData = data[middleIndex];
     
     if (middleData == k)
     {
         if ((middleIndex < length - 1 && data[middleIndex + 1] != k) || middleIndex == length -1)
             return  middleIndex;
         else
             start = middleIndex + 1;
     }
     else  if (middleData < k)
         start = middleIndex + 1;
     else
         end = middleIndex - 1;
     
     return  GetLastK(data, length, k, start, end);
}

 在分别找到第一个k和最后一个k的下标之后,就能计算出k在数组中出现的次数了。相应的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int  GetNumberOfK( int  *data,  int  length,  int  k)
{
     int  number = 0;
     
     if (data != NULL && length > 0)
     {
         int  first = GetFirstK(data, length, k, 0, length - 1);
         int  last = GetLastK(data, length, k, 0, length - 1);
         
         if (first > -1 && last > -1)
             number = last - first + 1;
     }
     
     return  number;
}

 

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
int  GetFirstK( int  *data,  int  length,  int  k,  int  start,  int  end)
{
     if (start > end)
         return  -1;
     
     int  middleIndex = start + ((end - start) >> 1);
     int  middleData = data[middleIndex];
     
     if (middleData == k)
     {
         if ((middleIndex > 0 && data[middleIndex - 1] != k) || middleIndex == 0)
             return  middleIndex;
         else
             end = middleIndex - 1;
     }
     else  if (middleData > k)
         end = middleIndex - 1;
     else
         start = middleIndex + 1;
     
     return  GetFirstK(data, length, k, start, end);
}
 
int  GetLastK( int  *data,  int  length,  int  k,  int  start,  int  end)
{
     if (start > end)
         return  -1;
     
     int  middleIndex = start + ((end - start) >> 1);
     int  middleData = data[middleIndex];
     
     if (middleData == k)
     {
         if ((middleIndex < length - 1 && data[middleIndex + 1] != k) || middleIndex == length -1)
             return  middleIndex;
         else
             start = middleIndex + 1;
     }
     else  if (middleData < k)
         start = middleIndex + 1;
     else
         end = middleIndex - 1;
     
     return  GetLastK(data, length, k, start, end);
}
 
int  GetNumberOfK( int  *data,  int  length,  int  k)
{
     int  number = 0;
     
     if (data != NULL && length > 0)
     {
         int  first = GetFirstK(data, length, k, 0, length - 1);
         int  last = GetLastK(data, length, k, 0, length - 1);
         
         if (first > -1 && last > -1)
             number = last - first + 1;
     }
     
     return  number;
}

 


本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3642322.html,如需转载请自行联系原作者

目录
相关文章
|
6月前
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
|
6月前
|
PHP
在数组中,找出给定数字的出现次数,比如[1,2,3,2,2]中2的出现次数是3次(任意编程语言描述)
在数组中,找出给定数字的出现次数,比如[1,2,3,2,2]中2的出现次数是3次(任意编程语言描述)
42 0
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
109 0
|
6月前
每日一题(づ ̄3 ̄)づ╭❤~(数字在升序数组中出现的次数,整数转换)
每日一题(づ ̄3 ̄)づ╭❤~(数字在升序数组中出现的次数,整数转换)
37 0
【剑指offer】-数字在排序数组中出现的次数-32/67
【剑指offer】-数字在排序数组中出现的次数-32/67
|
C语言
数字的排序
原理:(升序)将一串乱序数组中的数字元素进行相邻两两比较,如果第一个数字大于第二个数字,进行交换。然后继续进行第二个和第三个比较,如果第二个数比第三个数大,进行交换,反之则继续下一次比较。数组进行第一次全数组比较将得到数组中最大的数字放在数组最后。
58 0
数字的排序
|
C++
剑指offer 55. 数字在排序数组中出现的次数
剑指offer 55. 数字在排序数组中出现的次数
83 0
剑指offer_数组---数字在排序数组中出现的次数
剑指offer_数组---数字在排序数组中出现的次数
43 0
|
算法 C语言
剑指Offer 第53题:数字在升序数组中出现的次数
剑指Offer 第53题:数字在升序数组中出现的次数
136 0
剑指Offer 第53题:数字在升序数组中出现的次数