我正在执行代码挑战,给定两个整数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;
}
因此,此刻,如果您给代码赋值2和5,则应返回3,5。但是,这仅返回33333。我在做什么错?我该如何改善这段代码?
答案 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;
}