js 查找数字数组中的一个位置使的左右两边的和最接近(使的左右两边的差值最小)

 

1、普通逻辑实现

var arr = [1,4,19,27,4,6,18,36,57,1,3]


var sliceArray = function (arr, start, end) {
    return  arr.slice(start, end)
}
var sumArray = function (arr) {
    if (arr.length <= 0) {
        return 0
    }
    return arr.reduce(function(prev, curr){
        return prev + curr;
    });
}
var minArray = function( arr ){ 
    return Math.min.apply( Math, arr );
};

var indexOfArray = function (arr, value) {
    return arr.findIndex(function(item){
        return item == value
    });
}

var difference = function(leftSum, rightSum) {
    return Math.abs(leftSum - rightSum)
}

var count = 0;

var differenceArr = []

var differenceMap = {}

for (var i = 0; i<= arr.length; i++) {
    var leftArr = sliceArray(arr, 0, i)
    var rightArr = sliceArray(arr, i, arr.length)
    var leftSum = sumArray(leftArr)
    var rightSum = sumArray(rightArr) 
    var _difference = difference(leftSum, rightSum)
    console.log(i + "-left:" +leftArr.toString() + "==>" + leftSum)
    console.log(i + "-right:" +rightArr.toString() + "==>" + rightSum)
    console.log(i + "-left-right:" + _difference)

    differenceMap[_difference] = i;

    differenceArr.push(_difference)
}

var min = minArray(differenceArr)

console.log("differenceArr:" + differenceArr.toString())

console.log("differenceArr-min:" + min)

console.log("min-index:" + differenceMap[min])

-------------------------------------------------------------------------

2、利用递归函数实现

var arr = [1,4,19,27,4,6,18,36,57,1,3]

var sliceArray = function (arr, start, end) {
    return  arr.slice(start, end)
}

var sumArray = function (arr) {
    if (arr.length <= 0) {
        return 0
    }
    return arr.reduce(function(prev, curr){
        return prev + curr;
    });
}

var indexOfArray = function (arr, value) {
    return arr.findIndex(function(item){
        return item == value
    });
}

var difference = function(leftSum, rightSum) {
    return Math.abs(leftSum - rightSum)
}

var _i = 0, differenceValue, targetIndex; 

function calculate (arr) {

    if (_i >= arr.length) {

        return targetIndex
    }


    var leftArr = sliceArray(arr, 0, _i)

    var rightArr = sliceArray(arr, _i, arr.length) 

    var leftSum = sumArray(leftArr)

    var rightSum = sumArray(rightArr) 

    var _differenceValue = difference(leftSum, rightSum)

    console.log(_i + "-left:" +leftArr.toString() + "==>" + leftSum)
    console.log(_i + "-right:" +rightArr.toString() + "==>" + rightSum)
    console.log(_i + "-left-right:" + _differenceValue)

    if (_i == 0) {
        differenceValue = _differenceValue, targetIndex = _i;
    }  else if(differenceValue > _differenceValue){
        differenceValue = _differenceValue, targetIndex = _i;
    }

    console.log("differenceValue = " + differenceValue + ",targetIndex = " + targetIndex)

    _i++

    return calculate(arr)

}

var min = calculate(arr)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值