概述
public class TestMain {
public static void main(String[] args) {
//添加随机数到数组
int[] randomArray = new int[1000];
for (int i = 0; i < randomArray.length; i++) {
int randDomNum = new Random().nextInt(100)+1;
randomArray[i]=randDomNum;
}
//排序(二分法前提是有序)
Arrays.sort(randomArray);
//打印输出方便对比查看出现的次数
for (int i = 0; i < randomArray.length; i++) {
System.out.println(randomArray[i]+" "+i);
}
//出现的次数
int count = 0;
//最小数下标
int minIndex = 0;
//最大数下标
int maxIndex = randomArray.length-1;
System.out.println("请输入你要查找的数:");
Scanner sc = new Scanner(System.in);
//控制台输入的数
int inputNumber = sc.nextInt();
//当最小值下标小于等于最大值下标 才进入循环 反之说明已经该数组里面的数据已经循环完了 就退出循环
while (minIndex<=maxIndex){
//中间值下标
int midIndex = (minIndex+maxIndex)/2;
if(inputNumber==randomArray[midIndex]){ //当找到输入的数
/**
* 例如 1 2 2 5 7 7 7 7 7 8 9 9 11
* 当取到最中间的7之后 可以从中间7的位置向左开始循环遍历并统计该数出现的次数 同时向右也一样
* 并且他的最大下标和最小下标都是midIndex中间下标
* 但是为了中间的这个数不重复统计一次 可将 最小下标 往前移一位 或者 也可以把 最大下标 往后移一位 minIndex = minIndex; maxIndex = midIndex+1;
* 我这里是移动的最小下标
*/
minIndex = minIndex-1;
maxIndex = midIndex;
//向左循环遍历 最小下标不能小于0 并且取出的值要等于输入的值才统计次数 最小下标一直往左递减 离中间下标越来越远
while (minIndex>=0&&randomArray[minIndex]==inputNumber){
count++;
minIndex--;
}
//向右循环遍历 最大下标不能超过数组的长度 并且取出的值要等于输入的值才统计次数 最大下标一直往右递增 离中间下标越来越远
while (maxIndex<randomArray.length&&randomArray[maxIndex]==inputNumber){
count++;
maxIndex++;
}
//退出循环
break;
}else if(inputNumber<randomArray[midIndex]){ //当输入的数比中间值小 说明该数在中间值数的左边 此时移动最大下标为中间下标-1
maxIndex = midIndex-1;
}else if(inputNumber>randomArray[midIndex]){ //当输入的数比中间值大 说明该数在中间值数的右边 此时移动最小下标为中间下标+1
minIndex = minIndex+1;
}
}
System.out.println(inputNumber+"出现了"+count+"次");
}
}
最后
以上就是复杂花生为你收集整理的java二分法统计数组中某一个数出现的次数的全部内容,希望文章能够帮你解决java二分法统计数组中某一个数出现的次数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复