【发布时间】:2017-04-18 21:44:38
【问题描述】:
此代码生成一个随机数,按升序对其进行排序并进行二进制搜索以找到目标值。我的问题是如何修改此代码以找到给定目标的最大索引。例如数组有 { 1, 2 , 3, 5, 5, 5, 5},目标是 5,所以输出应该是 6 而不是 3。谢谢。
import java.util.*;
public class Sort
{
public static void main(String args[])
{
Scanner in = new Scanner(System.in);
System.out.print("How many numbers do you want? ");
int howMany = in.nextInt();
int [] myArray = getSortedRandomArray(howMany);
System.out.print("\nFor what value would you like to search? ");
int target = in.nextInt();
int index = bsearch ( myArray, target);
if (index >= 0)
{
System.out.println("The value " + target + " occurs at index " + index);
}
else
{
System.out.println("The value " + target + " does not occur in the array. ");
}
}
public static int bsearch(int[] arr, int key)
{
int lo = 0, hi = arr.length - 1;
{
while (lo < hi)
{
int mid = (lo + hi) / 2;
if (arr[mid] <= key)
lo = mid + 1;
if (arr[mid] > key)
hi = mid;
}
if (arr[lo] == key) {
return lo;
}
else if ((arr[lo] != key) && (arr[lo-1] == key)){
return lo - 1;
}
else{
System.out.print("The value " + key + " does not occur in the array. ");
}
return -1 ;
}
public static int[] getSortedRandomArray (int howMany)
{
int[] returnMe = new int [howMany];
Random rand = new Random();
for (int i = 0; i < howMany ; i++)
returnMe[i] = rand.nextInt(Integer.MAX_VALUE) + 1;
for (int i = 1; i <= (howMany - 1); i++)
{
for (int j = 0; j <= howMany - i -1; j++)
{
int tmp = 0;
if (returnMe[j] > returnMe[j+1])
{
tmp = returnMe[j];
returnMe[j] = returnMe[j + 1];
returnMe[j + 1] = tmp;
}
}
}
System.out.print("Here is a random sorted array: ");
for ( int i = 0; i < howMany; i++)
System.out.print(returnMe[i] + " ");
return returnMe;
}
【问题讨论】:
-
我??哈哈,不。对不起,先生,如果那不礼貌! @OusmaneMahyDiaw
-
没有问题,只是写的都是大写而已。
-
好吧,您已经找到了具有该值的一个元素的索引。并且具有相同值的所有其他元素彼此相邻。那么......你认为你怎么能找到它?
-
@AndyTurner 我曾想过使用循环,但如果有 100 个数字都具有相同的目标值,那会不会效率低下?
-
@rockster 就这么多? :) 请记住,正确性总是比速度更重要。用简单的方法来做,然后在分析显示这是一个问题时担心性能。
标签: java search binary-search