【问题标题】:Add odd numbers between a closed range to an array将封闭范围之间的奇数添加到数组
【发布时间】:2018-07-07 09:39:35
【问题描述】:

我正在做代码挑战,给定两个整数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。我做错了什么?我该如何改进这段代码?

【问题讨论】:

  • 你有这个内循环的理由是什么?
  • 你只需要一个循环就可以解决这个问题。当你最多可以有 ((R-L)+1)/2 个元素时,为什么要创建一个 R 元素数组。
  • 你的问题是你的内部循环,你正在运行整个数组并将每个值设置为i当时的任何值。
  • 另外:int[] theArray = new int[r]; 不会为您提供正确的数组长度。要弄清楚如何获得正确的长度,请考虑如何知道lr(含)之间有多少个奇数。
  • 好吧,假设 L = 50 和 R = 53。在您的代码中,您创建了一个包含 53 个元素的数组,但您不能有 53 个元素,因为您的区间中只有 4 个数字(50, 51,52,53)。所以在这种情况下 ((R-L)+1)/2 将是 2(这就是奇数的个数(51 和 53))。

标签: java arrays algorithm


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我会通过将范围中的下限推进到下一个奇数(如果还不是奇数)来解决这个问题,然后从那里开始。

    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 循环。

    【讨论】:

    • 是为了纠正我假设在行 l = (l % 2) == 0 ? l + 1 : l;您正在检查 l 是否为奇数,如果不是,您将 l 加 1 以使其奇数?
    • 是的,我确保范围的底部始终是奇数。假设自r &gt; l 以来始终可以做到这一点是合理的。
    • 还可以澄清数组[i] = l + (i*2);为什么要使用 (i*2) 将值插入数组?
    • 因为我们只想插入奇数。
    【解决方案3】:

    我会将工作委托给一个流或列表,它可以轻松且动态地管理选择的大小。

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

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

    【讨论】:

    • 感谢这个解决方案,我之所以没有将它作为答案,是因为我对 Java 8 表示法还不太熟悉。
    • @user6248190,实际上,IntStream.iterate(seed, hasNext, next) 来自 Java 9 ;)
    【解决方案4】:
    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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多