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)

猜你喜欢

转载自blog.csdn.net/lovearforever/article/details/83272083