Java 在闭合范围内查找奇数

Java 在闭合范围内查找奇数,java,algorithm,Java,Algorithm,我正在做一个代码挑战,给定两个整数l和r,我必须打印I和r之间的所有奇数(包括I和r)。函数必须返回一个整数数组,表示l和r之间的奇数 这就是我目前所拥有的 static List<Integer> oddNumbers(int l, int r) { List<Integer> list1 = new ArrayList<>(); if ((r > l) && (l >= 1) && (r <

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

这就是我目前所拥有的

 static List<Integer> oddNumbers(int l, int r) {
    List<Integer> list1 = new ArrayList<>();
    if ((r > l) && (l >= 1) && (r <= 100000)) {
        for (int i = tmp; tmp < r; i++) {
            if (l % 2 == 0)
               l = l + 1;              
            list1.add(l);
            l = l + 2;
        }
    }
    return list1;
}
有什么想法吗?
在挑战网站的QA上,它似乎与角落案例问题有关。

我建议使用以下代码:

public static List<Integer> getOdd(int l, int r) {
    List<Integer> odd = new ArrayList<Integer>();
    if (l % 2 == 0)
        l++;
    while(l <= r) {
        odd.add(l);
        l += 2;
    }
    return odd;
}
公共静态列表getOdd(int l,int r){
List奇数=新的ArrayList();
如果(l%2==0)
l++;

而(l这个版本应该是有效的

 static List<int> oddNumbers(int l, int r)
    {
        List<int> list1 = new List<int>();
        if ((r > l) && (l >= 1) && (r <= 100000))
        {
            int tmp = l % 2 == 0 ? l + 1 : l;            
            for (int i = tmp; i < r; i += 2)
            {
                list1.Add(i);
            }

        }
        return list1;
    }
静态列表奇数(int l,int r)
{
List list1=新列表();

如果((r>l)&&(l>=1)&&(r)如注释所述,您在循环中排除了
r
,并且可能返回了错误的数据结构

此外,您的代码所做的远远超过了它所需要的

  • 你只需要一个循环
  • 您根本不需要
    tmp
    ——只需修改
    l
  • 您不需要所有的if/else块
我建议如下:

static int[] oddNumbers(int l, int r) {
    List<Integer> list1 = new ArrayList<>();
    if (l % 2 == 0) l++;
    for(; l <= r; l += 2) {
        list1.add(l);
    }
    return list1.stream().mapToInt(i->i).toArray(); // https://stackoverflow.com/a/23945015/2554605
}
静态整数[]奇数(整数l,整数r){
List list1=新的ArrayList();
如果(l%2==0)l++;
对于(;l i).toArray();//https://stackoverflow.com/a/23945015/2554605
}

如果((r>=l)&&(l>=1)&(r而不是除以2并检查余数是0还是1,则可以加回
,
您可以使用
1(&1)
按位和,它将如下所示

如果
((数字和1)==1)
那么数字是奇数,这样可以减少复杂性。

这些看起来像是自定义消息。它们在代码中的位置?我建议不要重复代码。是的,在添加之前必须进行偶数检查,但不需要重复以下所有内容code@Stultuske我认为这些是代码挑战响应您可以添加挑战链接吗site?看起来您排除了r。此外,您应该返回数组还是列表?还不清楚。@Eran很可能这就是编译器消息的原因-errorNo,不应该。对于初学者:它返回一个Listadds ToArray()到结果,但这是算法问题。否。问题是:“我的错误来自哪里?”。标题仅限于此。在本例中,数组过度使用内存可能会被视为错误。或者仅应注意逻辑问题?取决于要求。如果要求为:“返回数组”,很有可能会对多个断言运行结果,以检查它是否是数组,以及result.length是否是它们期望的值。认真地说,为什么?首先,它必须返回数组,而不是列表,其次,如果可以只得到第一个奇数,然后加2,为什么要比较所有值以检查它们是否为奇数/偶数每次迭代,而不是每次都重新检查?我在@Yang的例子中看到他返回了一个列表。是的,你是对的,最好得到第一个奇数并加上2。事实上,他返回了一个列表。他还收到一条编译器错误消息,这很可能是由于返回了一个列表造成的。我确实编辑了我的答案,以避免每次都重新检查时间,但对于列表我真的不知道,因为他没有指定任何内容。无论如何,感谢您的回答!正如他的需求描述所述:“函数必须返回整数数组”只是一个想法。据我所知,限制(包括)是l和r,但除非该页面上的要求与此处发布的要求不同,否则没有说明两者中的哪一个是上限,哪一个是下限。@Stultuske我认为
l
r
因其名称而不言自明。我想如果它是通用的
a
b
,我们可以如果
a>b
,我会交换值,并保持我们的逻辑不变。我和r如何自我解释?可能是因为我自己不是以英语为母语的人,但仍然…@Stultuske我相信这是
l
,而不是
i
。我知道OP说的
i
,但这真的没有意义,因为他从
l
l开始
是左
的缩写;
r
是右
的缩写。因此
r
是上界是
l
是下界。
static int[] oddNumbers(int l, int r) {
    List<Integer> list1 = new ArrayList<>();
    if (l % 2 == 0) l++;
    for(; l <= r; l += 2) {
        list1.add(l);
    }
    return list1.stream().mapToInt(i->i).toArray(); // https://stackoverflow.com/a/23945015/2554605
}