有什么办法可以改善这个数组代码吗?

时间:2019-07-02 22:26:31

标签: java

这是App Academy入学挑战中的问题之一。它们并不难,但是我在Java方面的知识非常有限,因此花费的时间比平时长。我遇到的问题是:给定一个数字数组和一个目标数字,如果数组中的元素是目标数字的倍数,则以数组格式返回它们。例如:{7,12,9,9,5,15},3只会返回12,9,15

我的思考过程:我将只有一个空数组,其元素与传入的数组相同。创建一个count变量以增加临时数组。循环并分配值。为输出创建一个与方法相同类型的新变量,并将所有内容从temp数组传递到新数组。返回。

我觉得有一种更简单的方法可以执行此操作,但我不知道如何查找/查找什么。

    public static Integer[] multipleSelect(Integer[] nums, int target) {
        int [] temp = new int[nums.length];
        int count = 0;
        for(int x = 0; x < nums.length; x++)
        {
            if(nums[x] % target == 0)
            {
                temp[count] = nums[x];
                count++;
            }
        }
        Integer[] output = new Integer[count];
        for(int y = 0; y < count; y++)
        {
            output[y] = temp[y];
        }

        return output;
    }

网站接受了这个,但我却不太喜欢。我该如何改善?

3 个答案:

答案 0 :(得分:2)

好吧,您可以使用数组列表来提高程序的空间复杂度,当您的条件满足时,可以将值追加到列表中以提高第一个数组的空间复杂度,然后如果执行上述代码,则可以转换数组列表,按

Integer[] output = {name of arraylist}.toArray(); 

然后您可以从函数中返回此数组

答案 1 :(得分:1)

只要您可以使用Java 8或更高版本,这就是使用Stream的理想之地,它使您可以单行执行所需的操作:

import java.util.Arrays;

public class X {

    public static Integer[] multipleSelect(Integer[] nums, int target) {
        return Arrays.stream(nums).filter( x -> x % target == 0).toArray(Integer[]::new);
    }

    public static void main(String[] args) {
        Integer[] input = new Integer[] {7, 12, 9, 5, 15};
        Integer[] output = multipleSelect(input, 3);
        for (Integer i : output)
            System.out.println(i);
    }
}

结果:

12
9
15

答案 2 :(得分:0)

您可以使用两个递增值来删除第二个数组和循环,其中$ i表示输入数组的当前索引,$ j表示输出中的索引。 如上/下所述,您将从输出中使用arraylist或非固定长度数据类型中受益。