题目:
统计一个数字在排序数组中出现的次数。例如输入排序数组{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<iostream>
using namespace std;
int Function(int *arr, int length, int num)
{
if (arr == nullptr || length <= 0)
return 0;
int result = 0;
for (int i = 0; i < length; ++i)
{
if (num == arr[i])
++result;
}
return result;
}
void test11()
{
cout << "===========test1:输入字符串为空==========" << endl;
cout << Function(nullptr, 0, 3) << endl;
}
void test12()
{
cout << "===========test2:{1,2,3,3,3,3,4,5}==========" << endl;
int arr[] = { 1, 2, 3, 3, 3, 3, 4, 5 };
cout << Function(arr, 8, 3) << endl;
}
int main1()
{
test11();
test12();
cout << endl;
system("pause");
return 0;
}
运行结果:
===========test1:输入字符串为空==========
0
===========test2:{1,2,3,3,3,3,4,5}==========
4
请按任意键继续. . .
方法二:
源代码如下:
/*
统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中
出现了4次,因此输出4
*/
#include<iostream>
using namespace std;
int GetFirstK(int *arr, int length, int k, int start, int end)
{
if (start > end)
return -1;
int midIndex = (end + start) / 2;
int midData = arr[midIndex];
if (midData == k)
{
if ((midIndex > 0 && arr[midIndex - 1] != k) || midIndex == 0)
return midIndex;
else
end = midIndex - 1;
}
else if (midData > k)
end = midIndex - 1;
else
start = midIndex + 1;
return GetFirstK(arr, k, length, start, end);
}
int GetLastK(int *arr, int length, int k, int start, int end)
{
if (start > end)
return -1;
int midIndex = (start + end) / 2;
int midData = arr[midIndex];
if (midData == k)
{
if (midIndex == length - 1 || (midIndex < length - 1 && arr[midIndex + 1] != k))
return midIndex;
else
start = midIndex;
}
else if (midData > k)
end = midIndex - 1;
else
start = midIndex + 1;
return GetLastK(arr, length, k, start, end);
}
int GetNumOfK(int *arr, int length, int k)
{
if (arr == nullptr || length <= 0)
return 0;
int start = 0;
int end = length - 1;
int first = GetFirstK(arr, length, k, start, end);
if (first <= 0)//如果没有找到,直接返回0
return 0;
int last = GetLastK(arr, length, k, start, end);
return last - first + 1;
}
void test21()
{
cout << "===========test1:输入字符串为空==========" << endl;
cout << GetNumOfK(nullptr, 0, 3) << endl;
}
void test22()
{
cout << "===========test2:{1,2,3,3,3,3,4,5}==========" << endl;
int arr[] = { 1, 2, 3, 3, 3, 3, 4, 5 };
cout << GetNumOfK(arr, 8, 3) << endl;
}
void test23()
{
cout << "===========test2:{1,2,3,4,5}==========" << endl;
int arr[] = { 1, 2, 3, 4, 5 };
cout << GetNumOfK(arr, 5, 3) << endl;
}
int main()
{
test21();
test22();
test23();
cout << endl;
system("pause");
return 0;
}
===========test1:输入字符串为空==========
0
===========test2:{1,2,3,3,3,3,4,5}==========
4
===========test2:{1,2,3,4,5}==========
1
请按任意键继续. . .