Java 在数组的闭合范围之间添加奇数

Java 在数组的闭合范围之间添加奇数,java,arrays,algorithm,Java,Arrays,Algorithm,我正在进行代码挑战,给定两个整数l和r,我必须打印I和r之间的所有奇数(I和r)。函数必须返回一个整数数组,表示l和r之间的奇数 这就是我目前所拥有的 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 =

我正在进行代码挑战,给定两个整数
l
r
,我必须打印
I
r
之间的所有奇数(
I
r
)。函数必须返回一个整数数组,表示
l
r
之间的奇数

这就是我目前所拥有的

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;

}
静态整数[]奇数(整数l,整数r){
int[]数组=新的int[r];
for(int i=l;i

所以现在这个代码如果你给它值2和5,应该返回3,5。然而,这只返回33333。我做错了什么?如何改进这段代码?

我将通过将范围中的下限向前推进到下一个奇数(如果不是奇数),然后从那里开始

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;
}
静态整数[]奇数(整数l,整数r){
if(r
static int[]oddNumbers(int l,int r){
int[]数组=新的int[((r-l)/2)+1];

对于(inti=l%2==0?l:l+1,j=0;i我会将工作委托给一个流或列表,该流或列表可以轻松动态地管理选择的大小

如果我们可以在最后从一个适当的结构进行简单的转换,那么我们为什么还要担心结果数组的大小呢

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

我们已经到了2018年,并且已经拥有了自Java 8以来令人惊叹的
流!通过它,您可以在一行中解决这些问题!因此值得一看:

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

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

你的理由是什么?你只需要一个循环就可以解决这个问题。为什么要创建一个R元素数组,而你最多只能有((R-L)+1个元素)/2个元素。您的问题是您的内部循环,您正在运行整个数组,并将每个值设置为当时的
i
值。分别为:
int[]theArray=new int[r]不会给你正确的数组长度。要知道如何得到正确的长度,考虑如何知道在代码> L>代码>和<代码> R< /代码>(包含)之间有多少奇数。在你的代码中,你创建了一个由53个元素组成的数组,但是你不能有53个元素,因为在你的区间(50,51,52,53)中只有4个数字。所以在这种情况下((R-L)+1)/2将是2(这是奇数(51和53)的数目)。对我来说是正确的,假设在L=(L%2)行中==0?l+1:l;您正在检查l是否为奇数,如果不是,则将1添加到l中以使其为奇数?是的,我确保范围的底部始终是奇数。可以合理地假设这总是可以完成的,因为
r>l
。还可以澄清数组[I]=l+(I*2);为什么使用(I*2)要在数组中插入值吗?因为我们只想插入奇数。感谢这个解决方案,我之所以没有把它作为答案,是因为我还不太熟悉Java 8的符号。@user6248190,实际上,
IntStream.iterate(seed,hasNext,next)
来自Java 9;)
static int[] oddNumbers(int i, int j){
        return IntStream.rangeClosed(i, j).filter(num -> num % 2 == 1).toArray();
    }