可以找到问题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,然后检查它与索引的关系。
有人可以分享一些光线吗?
答案 0 :(得分:1)
挑战的最后一个问题是“需要多少贿赂才能使队列进入这种状态”。
因此,他选择从每个数字的末尾开始,首先检查其数字是否比其原始位置提前3个或更多位置-您已经知道了这一部分。
现在,如果距离不超过3个或更多,您想知道有多少个遥远的地方,只需返回2个地方,并检查2个地方和1个地方的数字是否大于当前位置的价值。如果他们是-这意味着他们贿赂了他到达那里,所以我们增加“贿赂”变量并继续进行下一个整数并重复该过程。由于他从末尾进入数组,因此他将位置减小到了我们当前值可以达到的“粗度”。
如果有帮助,当for
为0时,可以完全跳过整个positionDiff
循环,如果他在too chaotic
检查之后进行了检查,则效率可能更高。 / p>
请注意,在“ for”循环中,他将其修剪为Math.max(0, briberPosition)
,以避免超出数组限制。