在封闭范围内将奇数添加到数组

时间:2018-07-07 09:39:35

标签: java arrays algorithm

我正在执行代码挑战,给定两个整数lr,我必须打印ir之间的所有奇数(ir(包括)。该函数必须返回一个整数数组,该整数表示lr之间的奇数。

这是我到目前为止所拥有的

static int[] oddNumbers(int l, int r) {
    int[] theArray = new int[r];
    for (int i = l; i < theArray.length; i++) {
        if (i % 2 != 0) {
            for (int n = 0; n < theArray.length; n++) {
                theArray[n] = i;
            }
        }
    }
    return theArray;

}

因此,此刻,如果您给代码赋值2和5,则应返回3,5。但是,这仅返回33333。我在做什么错?我该如何改善这段代码?

4 个答案:

答案 0 :(得分:4)

我们已经到了2018年,自Java 8以来就已经拥有了惊人的Streams!这样您就可以在一行中解决这些问题!因此值得一看:

static int[] oddNumbers(int i, int j){
        return IntStream.rangeClosed(i, j).filter(num -> num % 2 == 1).toArray();
    }

(除非您真的想学习算法,而不仅仅是解决挑战!)

答案 1 :(得分:3)

我可以通过将范围的下限推进到下一个奇数(如果还不是奇数),然后从那里开始进行处理。

static int[] oddNumbers(int l, int r) {
    if (r <= l) return null;

    l = (l % 2) == 0 ? l + 1 : l;
    int size = ((r - l) / 2) + 1;

    int[] theArray = new int[size];

    for (int i=0; i < size; ++i) {
        theArray[i] = l + (i*2);
    }

    return theArray;
}

这里真正的困难在于制定将一系列奇数映射到平面数组的逻辑。完成此操作后,我们可以看到填充数组仅需要一个简单的for循环。

答案 2 :(得分:1)

我将工作委派给可以轻松动态地管理选择内容的流或列表。

如果我们可以从最后的适当结构进行简单转换,为什么还要麻烦一下结果数组的大小呢?

static int[] oddNumbers(int l, int r) {
    return IntStream.iterate(l, i -> i <= r, i -> ++i)  
                    .filter(i -> i % 2 != 0)
                    .toArray();
}

答案 3 :(得分:0)

static int[] oddNumbers(int l, int r) {
    int[] theArray = new int[((r - l) / 2) + 1];
    for (int i = l % 2 == 0 ? l : l + 1, j = 0; i <= r; i += 2, j++)
        theArray[j] = i;


    return theArray;

}