javascript - 数字串不均匀位置检测算法

查看:109
本文介绍了javascript - 数字串不均匀位置检测算法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

给定一个数字串,检测其不均匀数字的位置。比如:

输入"1 2 2" 返回 "1"
输入"1 2 1 1" 返回 "2"
输入"2 4 7 8 10" 返回 "3" 

解决方案

如果不均匀度是指奇偶性的话,代码如下:

function test(str) {
    var arr = str.split(" ");
    var even = arr.filter(v=>!(v%2));
    var odd = arr.filter(v=>!!(v%2));
    return isNaN(+even)?+odd:+even;
}

如果不均匀度指不符合等差数列的项的话,代码如下:

function test(str){
    var arr = str.split(" ");
    
    //数组长度小于3抛出错误
    if(arr.length < 3){
        throw new Error("Array length can't less than 3.");
    }

    //数组长度为3时不能从等差数列判断
    //假如数组中有两个元素相同,则返回剩下的一个元素
    if(arr.length == 3){
        var r = arr.filter(v=>v!=a[0]);
        return r.length==1 ? +r : a[0];
    }
    
    //数组长度大于3
    var d = [];    //储存数列中每两个元素间的等差项 如: [1,2,6,4]=>[1,4,-2]
    arr.reduce(function(p,n){
        d.push(n-p);
        return n;
    });
    
    //d[0]的值是否唯一
    var d0u = !isNaN(+d.filter(v=>v==d[0]));
    
    //d[1]的值是否唯一
    var d1u = !isNaN(+d.filter(v=>v==d[1]));
    
    if(d0u && d1u){
        if(d[0]+d[1]==2*d[2])    //例: arr:[0,1,0,0], d:[1,-1,0]
            return +arr[1];
        else                     //例: arr:[0,0,1,0], d:[0,1,-1]
            return +arr[2];
    }else if(d0u){               //例: arr:[1,0,0,0], d:[-1,0,0]
        return +arr[0];
    }else if(d1u){               //例: arr:[0,0,1,0,0], d:[0,1,-1,0]
        return +arr[2];
        //以上是从arr前3项不能推出正确等差数列的特殊情况
    }else{
        //一般情况:arr[0],arr[1],arr[2]为等差项,可以直接推导等差数列的通项公式
        // d[0]为数组的公差,arr[0]为首项,筛选出不符合数组通项公式的数组元素
        return +arr.filter((v,i)=>v!=(+arr[0]+i*d[0]));
    }
}

这篇关于javascript - 数字串不均匀位置检测算法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆