题目一:数字在排序数组中出现的次数。
统计一个数字在排序数组中出现的次数。例如,输入排序
数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数
组中出现了4次,因此输出4。
设计一个改进的二分查找法,
分别查找数组中第一个该数字和最后一个该数字,
找到之后;利用索引计算中间该数字的个数;
package helen.c;
public class ArrayFind {
void test(String testName, int data[], int k, int expected){//{3, 3, 3, 3, 4, 5};
if(testName != null)
System.out.printf("%s begins: ", testName);
int result = arrayFind(data, k);
if(result == expected)
System.out.printf("Passed.\n");
else
System.out.printf("Failed.\n");
}
// 查找的数字出现在数组的中间
void test1(){
int data[] = {1, 2, 3, 3, 3, 3, 4, 5};
test("Test1", data, 3, 4);
}
// 查找的数组出现在数组的开头
void test2(){
int data[] = {3, 3, 3, 3, 4, 5};
test("Test2", data, 3, 4);
}
// 查找的数组出现在数组的结尾
void test3(){
int data[] = {1, 2, 3, 3, 3, 3};
test("Test3", data, 3, 4);
}
// 查找的数字不存在
void test4(){
int data[] = {1, 3, 3, 3, 3, 4, 5};
test("Test4", data, 2, 0);
}
// 查找的数字比第一个数字还小,不存在
void test5(){
int data[] = {1, 3, 3, 3, 3, 4, 5};
test("Test5", data, 0, 0);
}
// 查找的数字比最后一个数字还大,不存在
void test6(){
int data[] = {1, 3, 3, 3, 3, 4, 5};
test("Test6", data, 6, 0);
}
// 数组中的数字从头到尾都是查找的数字
void test7(){
int data[] = {3, 3, 3, 3};
test("Test7", data, 3, 4);
}
// 数组中的数字从头到尾只有一个重复的数字,不是查找的数字
void test8(){
int data[] = {3, 3, 3, 3};
test("Test8", data, 4, 0);
}
// 数组中只有一个数字,是查找的数字
void test9(){
int data[] = {3};
test("Test9", data, 3, 1);
}
// 数组中只有一个数字,不是查找的数字
void test10(){
int data[] = {3};
test("Test10", data, 4, 0);
}
// 鲁棒性测试,数组空指针
void test11(){
test("Test11", null, 0, 0);
}
public static void main( String args[]) {
new ArrayFind().test1();
new ArrayFind().test2();
new ArrayFind().test3();
new ArrayFind().test4();
new ArrayFind().test5();
new ArrayFind().test6();
new ArrayFind().test7();
new ArrayFind().test8();
new ArrayFind().test9();
new ArrayFind().test10();
}
private static int arrayFind(int[] a,int target) {
if(a==null||a.length==0){
return 0;
}
int firstTarget=getFirst(a,target,0,a.length-1);
// System.out.println(firstTarget);
int lastTarget=getLast(a,target,0,a.length-1);
//System.out.println(lastTarget);
return lastTarget-firstTarget+1;
}
// 1,2,3,3,3,3,3,5,6,7,8
private static int getFirst(int[] a, int target, int start, int end) {
int mid=start+end>>1;
if(start>end){
return -1;
}
//寻找第一个3
if(a[mid]==target){
if(mid>=1&&a[mid-1]==target){
return getFirst(a,target,start,mid-1);
}else {
return mid;
}
}else if(a[mid]>target){
return getFirst(a,target,start,mid-1);
}else {
return getFirst(a,target,mid+1,end);
}
}
private static int getLast(int[] a, int target, int start, int end) {
// 1,2,3,3,3,3,3,5,6,7,8
int mid=start+end>>1;
if(start>end){
return -2;
}
//寻找最后一个3
if(a[mid]==target){
if(midtarget){
return getLast(a,target,start,mid-1);
}else {
return getLast(a,target,mid+1,end);
}
}
}