将小麦与切夫分离-CodeWars挑战

时间:2019-07-23 19:51:49

标签: javascript arrays splice

简介

Link to challenge for best instructions

上解释了该问题

据我所知,这个想法是如果左侧的元素大于{{,则将数组左侧的元素 swap 替换为数组右侧的元素1}}。

0

左侧的正数必须换成与它们相对应的右侧的“不合适”。因此,很遗憾,我们无法使用

[2, -4, 6, -6] => [-6, -4, 6, 2]

最后,左侧应该只有负数,右侧应该只有正数。如果数组的长度为奇数,则一个“边”将大一个(或多个)元素,具体取决于原始数组中是否存在更多的正数或负数。

array = array.sort((a, b) => a - b);

方法

为解决此问题,我创建了一个冗长的算法,将数组分成两半,并在左侧跟踪“不适当”(正)元素,在右侧跟踪“不适当”(负)元素侧面,用于交换:

[8, 10, -6, -7, 9, 5] => [-7, -6, 10, 8, 9, 5]

有时候以前的方法行得通,但是它使我在Codewars上出现了一个错误

  

AssertionError [ERR_ASSERTION]:[-10,7] deepEqual [-10,-3,7]

您是否发现我的逻辑有任何缺陷?有更好的策略建议吗?

2 个答案:

答案 0 :(得分:1)

我使用两个"pointers"解决了这个问题,一个开始于数组的head,另一个开始于数组的tail。这个想法是,在每次迭代中,迭代地递增head或递减tail,直到您在head指针上找到一个正数,而在tail上找到一个负数。指针。当满足此条件时,则必须交换元素的位置并继续。最后,当head指针大于tail指针时,您必须停止循环。

function wheatFromChaff(values)
{
    let res = [];
    let head = 0, tail = values.length - 1;

    while (head <= tail)
    {
       if (values[head] < 0)
       {
           res[head] = values[head++];
       }
       else if (values[tail] > 0)
       {
           res[tail] = values[tail--];
       }
       else
       {
           res[tail] = values[head];
           res[head++] = values[tail--];
       }
    }

    return res;
}

console.log(wheatFromChaff([2, -4, 6, -6]));
console.log(wheatFromChaff([8, 10, -6, -7, 9]));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

此方法通过了该链接上提到的所有测试:

  

时间:894ms通过:5失败:0

但是也许有更好的解决方案。

答案 1 :(得分:1)

另一种方式,使用indexOf()lastIndexOf()辅助函数:

function lastIndexOf(arr, pred, start) {
  start = start || arr.length - 1;
  for (let i = start; i >= 0; i--) {
    if (pred(arr[i])) return i;
  }
  return -1;
}

function indexOf(arr, pred, start = 0) {
  for (let length = arr.length, i = start; i < length; i++) {
    if (pred(arr[i])) return i;
  }
  return Infinity;
}

function wheatFromChaff(values) {
    
    let firstPos = indexOf(values, x => x > 0);
    let lastNeg = lastIndexOf(values, x => x < 0);
    
    while ( firstPos < lastNeg ) {
      let a = values[firstPos];
      let b = values[lastNeg];
      values[firstPos] = b;
      values[lastNeg] = a;
      
      firstPos = indexOf(values, x => x > 0, firstPos);
      lastNeg = lastIndexOf(values, x => x < 0, lastNeg);
    }
    return values;
}
console.log(wheatFromChaff([2, -6, -4, 1, -8, -2]));