Rumah  >  Soal Jawab  >  teks badan

求助一个数组操作问题

我有一个数组需要将其反转,下面是列子,需要注意的最大值4的位置不能变,然后将最大值前面与后面的值分别重新倒置编排进去,数学不太好,求助大家帮忙

var arr = [1, 0, 4, 3, 2];
反转为
var arr = [2, 3, 4, 0, 1];

var arr = [0, 4, 3, 2, 1];
反转为
var arr = [3, 4, 0, 1, 2];

var arr = [4, 3, 2, 1, 0];
反转为
var arr = [4, 0, 1, 2, 3];

var arr = [3, 2, 1, 0, 4];
反转为
var arr = [0, 1, 2, 3, 4];


高洛峰高洛峰2893 hari yang lalu1701

membalas semua(5)saya akan balas

  • 三叔

    三叔2016-11-17 15:19:55

    var array = [10, 20, 45, 56, 15];
    var maxIndex = array.reduce((iMax, x, i, arr) => x > array[iMax] ? i: iMax, 0 );
    var removedItem = array.splice(maxIndex , 1);
    var reversedArray = array.reverse();
    reversedArray.splice(maxIndex, 0, removedItem[0]);
    console.log(reversedArray); // [15, 45, 20, 56, 10]

    1 reduce获取到最大值的index

    2 splice将最大值从原数组中移除

    3 reverse将数组翻转

    4 将最大值放回原位置


    balas
    0
  • 欧阳克

    欧阳克2016-11-17 15:19:34

    //PHP

    $arr = array(0, 4, 3, 2, 1);
    $b = array_shift($arr);
    $c = array_chunk($arr,2);
    asort($c['0']);
    asort($c['1']);
    print_r(array_merge($c['0'],(array)$b,$c['1']));


    balas
    0
  • 三叔

    三叔2016-11-17 15:19:17

    第一个方法

    <script>
    
    var arr = [1, 0, 4, 3, 2];
    
    
    //var arr = [2, 3, 4, 0, 1];
    console.log(arr);
    var index=get_index(4,arr);
    arr.splice(index,1);
    
    arr.reverse();
    
    arr.splice(index,0,4);
    
    console.log(arr);
    function get_index(val,arr){
    
        for(var i=0;i<arr.length;i++){
            if(arr[i]==val){   
                   return i;
            }
        }
    }
    </script>


    balas
    0
  • 欧阳克

    欧阳克2016-11-17 15:18:45

    这样就可以了
    var arr = [3, 2, 1, 0, 4];
    var max = arr[0]; //最大值
    for(var i=1;i<arr.length;i++){

    if(max<arr[i])max=arr[i];
    }
    var index = arr.indexOf(max);//最大值下标
    arr.splice(index,1);//删除最大值
    arr.reverse();//倒叙数组 也可按照你自己的排序规则自己排序
    arr.splice(index,max,max);//指定位置添加元素
    console.log(arr);


    balas
    0
  • 三叔

    三叔2016-11-17 15:18:30

    这个其实很简单的,以空间换时间,先翻转,然后连拼3个,再计算之前的最大值所在的位置,进行新数组的切割。

    最大的性能消耗在getmax上。

    var test = [
      [1, 0, 4, 3, 2],
      [0, 4, 3, 2, 1],
      [4, 3, 2, 1, 0],
      [3, 2, 1, 0, 4]
    ];
    
    test.forEach(arr => console.log(reversal(arr)));
    
    // 反转
    function reversal(arr) {
      let len = arr.length;
      // get max
      let max = arr[0];
      let index = 0;
      arr.forEach((v, i) => {
        if (v <= max) return;
        max = v;
        index = i;
      });
    
      // strat re
      let tmp = arr.reverse().concat(arr, arr);
      let newIndex = len - 1 - index + len;
    
      return tmp.slice(newIndex - index, newIndex + len - index);
    }


    balas
    0
  • Batalbalas