对于Hackerrank(Javascript)上的新年混乱的理解解决方案

时间:2019-08-18 08:19:43

标签: javascript

可以找到问题here

我为此苦苦挣扎了很长一段时间-我一直都忽略了用Java或一般语言学习与CS相关的材料。但是我将在一些不同的公司进行面试,并且一些人已通知该技术面试将与数据结构/算法相关,因此我目前正在在线学习一些课程,并完成有关Hackerrank的挑战。

无论如何-几个小时后,我最终屈服了,并查找了一些解决方案。 一个就是这个:

let queue1 = [2, 1, 5, 3, 4];
let queue2 = [2, 5, 1, 3, 4]; 

function minimumBribes(q) {
  let bribes = 0;
  let currentIndex = q.length - 1;
  let positionDiff;

  while (currentIndex >= 0) {
    const currentValue = q[currentIndex];
    const valuePosition = currentIndex + 1;
    positionDiff = currentValue - valuePosition; 

    if (positionDiff >= 3) {
      return "Too chaotic";
    }

    const briberPosition = currentValue - 2;
    for (let comparePosition = Math.max(0, briberPosition); comparePosition < currentIndex; comparePosition++) {
      const compare = q[comparePosition];

      if (compare > currentValue) {
        bribes++;
      }
    }
    currentIndex--;
  }

 return bribes;
}

minimumBribes(queue1)

我知道我们需要检查一个数字是否向前移动了2个以上的空格,并检查其值与位置的关系。 但是,进入

const briberPosition = currentValue - 2;
for (let comparePosition = Math.max(0, briberPosition); comparePosition < currentIndex; comparePosition++) { ... }

让我感到困惑。我在调试器中用不同的值缓慢地进行了此操作,我无法理解为什么我们将currentValue-2设置为briberPosition,然后检查它与索引的关系。

有人可以分享一些光线吗?

1 个答案:

答案 0 :(得分:1)

挑战的最后一个问题是“需要多少贿赂才能使队列进入这种状态”。

因此,他选择从每个数字的末尾开始,首先检查其数字是否比其原始位置提前3个或更多位置-您已经知道了这一部分。

现在,如果距离不超过3个或更多,您想知道有多少个遥远的地方,只需返回2个地方,并检查2个地方和1个地方的数字是否大于当前位置的价值。如果他们是-这意味着他们贿赂了他到达那里,所以我们增加“贿赂”变量并继续进行下一个整数并重复该过程。由于他从末尾进入数组,因此他将位置减小到了我们当前值可以达到的“粗度”。

如果有帮助,当for为0时,可以完全跳过整个positionDiff循环,如果他在too chaotic检查之后进行了检查,则效率可能更高。 / p>

请注意,在“ for”循环中,他将其修剪为Math.max(0, briberPosition),以避免超出数组限制。