【问题标题】:Passing Arrays.copyofrange into a method将 Arrays.copyofrange 传递给方法
【发布时间】:2018-04-13 17:53:34
【问题描述】:

当给定一个数组(按升序)或整数时,我想以一种有效的方式在数组中找到整数。我检查数组的中间数字是否等于要检查的数字。如果是,那就太好了!如果不是,那么我检查该数字是否大于或小于中间数字。我将阵列切成两半并再次检查。但是,我一直得到零值。

public static int findNumber(int[] array, int number){
        int position = 0;
        int half = array.length/2;
        //System.out.println(array[half]);
        if (array[half]==number){
            position=array.length/2;
        }
        else if (array[half]<number){
            findNumber(Arrays.copyOfRange(array, half, array.length),number);
        }
        else if (array[half]>number){
            findNumber(Arrays.copyOfRange(array,0,array.length/2),number);
        }
        return position;
    }

唯一的例外是如果检查的数字是数组的确切中间数字。我认为该错误与我不了解 Arrays.copyOfRange(original, to: , from: ) 的工作原理有关。

【问题讨论】:

  • 这种方法不正确,会返回错误的结果。如果您在每次调用时都更改索引,如何返回实际数组中的索引?你应该看看二分搜索实现,因为它是用于
  • 根据您的描述,您正在尝试实现二进制搜索算法。你解决问题的方法是错误的。您必须也不需要以任何方式更改原始数组,当然也不要复制它的元素。你只关心中间元素。
  • 使用此方法或使用 Arrays.copyOfRange() 方法并递归遍历提供的数组(包括接受的答案,甚至如果有效)。实际上,使用 for 循环简单地遍历提供的数组并在找到提供的数字后将其中断实际上更快。当然,如果数组中不存在所提供的数字,则需要采用一种方法,例如:return (i == array.length ? -1 : i); 其中 i 是迭代器计数器。 -1 表示未找到。代码也少了很多。

标签: java arrays recursion search


【解决方案1】:

您需要添加一个值来跟踪您传递回方法的范围左侧有多少索引。

public static int findNumber(int[] array, int number){
     return(helper(array, number, 0);
}

public static int helper(int[] array, int number, int leftOf){
    int half = array.length/2;
    //System.out.println(array[half]);
    if (array[half]==number){
        return(half+leftOf);
    }
    else if (array[half]<number){
        return(
      helper(Arrays.copyOfRange(array, half, array.length),number,leftOf+half));
    }
    else if (array[half]>number){
        return(
      helper(Arrays.copyOfRange(array,0,array.length/2),number,leftOf));
    }
}

【讨论】:

  • 谢谢,但我收到一个新错误。当我尝试在 main 方法中对此进行测试时,它给了我错误:不能在静态环境中使用非静态方法。我应该如何解决这个问题?
  • 我在答案中将方法设为静态。 @DevilsHnd 你还需要让助手保持静止
  • 哦...请确保您的答案至少可以编译。它缺少一些好东西。谢谢。
  • @DevilsHnd 它编译得很好。但是,我决定复制一个数组是没用的,所以我只是废弃它并重新进行二进制搜索
【解决方案2】:

根据 java.util 文档 Arrays.copyOfRange:

将指定数组的指定范围复制到一个新数组中

在每个递归调用中,您将获得一个新数组,其中搜索项的位置将与原始数组不同。

【讨论】:

  • 例如,您可以传递整个数组和两个索引:'from' 和 'to',您可以使用它们来分隔查找数字的位置。
猜你喜欢
  • 2015-11-04
  • 2011-01-01
  • 2021-04-25
  • 2014-06-03
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
相关资源
最近更新 更多