确定数组是算术还是几何级数(来自Coderbyte)

dwi*_*ank 4 javascript

就coderbyte而言,这是我的功能代码.但我觉得不应该这么复杂.我错过了一个简单的技巧吗?

function ArithGeo(arr)
{
    var array_type = -1;
    if (arr.length <= 2) return true;

    var a = arr[1], r = a/arr[0], i;
    for (i = 2; i < arr.length; ++i) {
        if ((a *= r) == arr[i]){
            array_type = "Geometric";
        }
        else{
            array_type = -1;
            break;
        }
    }

    if (array_type == "Geometric")
        return array_type;


    a = arr[1], d = a - arr[0], i;
    for (i = 2; i < arr.length; ++i) {
        if ((a += d) == arr[i]){
            array_type = "Arithmetic";
        }
        else {
            array_type = -1;
            break;
        }
    }
    return array_type;
}

ArithGeo([3,9,15,21,27, 28]);
Run Code Online (Sandbox Code Playgroud)

Kei*_*out 7

function ArithGeo(arr) { 

var diff = arr[1] - arr[0];
var ratio = arr[1] / arr[0];

var arith = true;
var geo = true;

for(var i = 0; i < arr.length - 1; i++)
{
    if( arr[i + 1] - arr[i] !== diff )
      arith = false;
    if(arr[i + 1] / ratio !== arr[i])
      geo = false;
}

if(arith === true)
    return "arithmetic";
else if(geo === true)
    return" geometric";
else
    return -1;

}
Run Code Online (Sandbox Code Playgroud)

这也是一个简单的解决方案.我要么寻找一个几何图案,其中给定的元素可以被前一个元素整除,或者是一个算术模式,其中每个元素增加一个恒定的量.两个变量diff和ratio包含要在整个阵列中搜索的每个模式.

我首先假设arith和geo是真的,如果我找到一个不正确的例子,我将其值设置为false.请注意,您的代码有两个for循环,条件完全相同.这是一个很好的指示,您的代码可以压缩成一个循环.

每次通过循环时,我都会测试条件是否存在以将arith或geo设置为false.最后,在循环退出后,我将确定arith或geo在整个循环中是否保持为真.如果没有,我返回 - 1来自Coderbyte请求的问题.

编辑:快速记录我的for循环条件.由于我每次检查都会检查i + 1的值,因此我确保通过将退出条件设置为arr.length来确保我不会超出范围 - 这样,i + 1仍然可以到达最后一个元素,并且肯定不会超越.


Ant*_*ala 6

对于算术级数,从前一个元素中减去每个元素; 他们的差别应该是平等的; 对于几何,将每个元素除以前一个元素,该比例应保持不变.当你遇到0时除以零,javascript给你Inf(它肯定不是几何级数).因为浮点数不准确,您可能希望存储这些值的最小值和最大值,然后查看它们是否彼此足够接近.

function arithGeo(arr) {
    var minRatio = 1/0,
        maxRatio = -1/0,
        minDiff  = 1/0,
        maxDiff  = -1/0,
        epsilon  = 0.000001,
        i,
        ratio,
        diff;

    if (arr.length <= 2) {
        return;
    }

    for (i = 1; i < arr.length; ++i) {
        diff  = arr[i] - arr[i - 1];
        ratio = arr[i] / arr[i - 1];
        minDiff  = Math.min(diff, minDiff);
        maxDiff  = Math.max(diff, maxDiff);
        minRatio = Math.min(ratio, minRatio);
        maxRatio = Math.max(ratio, maxRatio);
    }

    if (Math.abs(minDiff - maxDiff) < epsilon) {
        return "Arithmetic";
    }

    if (Math.abs(minRatio - maxRatio) < epsilon) {
        return "Geometric";
    }

    return;
}

alert(arithGeo([3,9,15,21,27,28]));
alert(arithGeo([3,9,15,21,27]));
alert(arithGeo([4,2,1,0.5]));
Run Code Online (Sandbox Code Playgroud)