【问题标题】:Return even and odd numbers between dynamic ranges in javascript返回javascript中动态范围之间的偶数和奇数
【发布时间】:2018-09-27 13:54:32
【问题描述】:

我正在尝试编写一个代码(函数),它接受两个参数 a 和 b,如果 a 大于 b,则返回 a 和 b 之间的所有偶数,否则它应该返回 a 和 b 之间的奇数。

这是我的代码。

function number_ranges (a, b) {

    let numbers = [];

    if (a > b){
        for (let i = b; i < a; i++){
            if (i > b){
                numbers.push(i);
            }
        }
    }else{
        for (let i = a; i < b; i++){
            if (i > a){
                numbers.push(i);
            }
        }
    }

    const result = numbers.filter(function(num){
        return a > b ? num % 2 === 0: num % 2 === 1;
    });
    return result;
}

我希望看到不同的方法,因为我似乎无法通过所有测试用例

【问题讨论】:

  • 顺序重要吗?
  • 你为什么要把所有的数字都推入而不是过滤?没必要……
  • 你有一个不工作的测试用例的例子吗?
  • if(i &gt; a) 那么为什么不直接从i=a+1 开始,而不必进行检查呢?
  • 没有顺序无关紧要,但自然会排序,因为我会从最低的开始迭代.....如果我错了,请纠正我,虽然我是新手

标签: javascript arrays


【解决方案1】:

您可以进行单循环并检查该值是否为偶数,或者与订单检查结合使用。

function getEvenOdd(a, b) {
    var inc = +(a < b) || -1,
        i,
        result = [];
     for (i = a; i !== b + inc; i += inc) {
         if (+(inc === 1) !== i % 2) {
             result.push(i);
         }
     }
     return result;
}

// even
console.log(getEvenOdd(3, 10).join(' ')); // [4, 6, 8, 10]
console.log(getEvenOdd(4, 10).join(' ')); // [4, 6, 8, 10]
console.log(getEvenOdd(3, 9).join(' '));  // [4, 6, 8]
console.log(getEvenOdd(4, 9).join(' '));  // [4, 6, 8]

// odd
console.log(getEvenOdd(10, 3).join(' ')); // [9, 7, 5, 3]
console.log(getEvenOdd(10, 4).join(' ')); // [9, 7, 5]
console.log(getEvenOdd(9, 3).join(' '));  // [9, 7, 5, 3]
console.log(getEvenOdd(9, 4).join(' '));  // [9, 7, 5]

【讨论】:

    【解决方案2】:

    我用过这个功能f=(a,b)=&gt;[...ArrayMath.max(a,b))].map((q,i)=&gt;i).filter(z=&gt;(a&lt;b?!(z%2):z%2)&amp;&amp;z&gt;=Math.min(a,b))

    我首先创建一个从 1 到 b 的范围,如下 [...Array(Math.max(a,b))].map((q,i)=&gt;i)

    然后我用a&lt;b?!(z%2):z%2 过滤。如果 a 大于 b 则 a 保留偶数,否则保留赔率。

    我也只使用&amp;&amp;z&gt;=Math.min(a,b)保留那些大于或等于第一个参数的数字

    f=(a,b)=>[...Array(Math.max(a,b))].map((q,i)=>i).filter(z=>(a<b?!(z%2):z%2)&&z>=Math.min(a,b))
    console.log(f(10, 5))
    console.log(f(5, 10))

    【讨论】:

    • 你的函数在a
    • @Joe25 感谢您的注意,我把它倒过来了(不太擅长英语:c)。
    • 是的,它工作得很好,只是它返回偶数过滤器的最后一个数字......它应该只返回忽略起点和终点之间的数字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    相关资源
    最近更新 更多