【发布时间】:2019-10-21 02:10:51
【问题描述】:
我在HackerRank上练习了更多的问题,我遇到了一个叫做“新年混乱”的问题。基本上前提是对数组进行排序并计算所做的开关。关键是没有数字被允许超过2个开关。 BubbleSort 通过了前几个测试,但在其余测试中超时。是否有更有效的数组排序算法仍然考虑到开关的数量?我尝试了 mergeSort 和 quickSort,但是在这样划分数组时很难跟踪开关。
问题提示: 这是元旦,每个人都在排队参加仙境过山车!排队的人很多,每个人都贴着一张贴纸,标明他们在队列中的初始位置。初始位置从行的前面到后面递增。
队列中的任何人都可以贿赂直接排在他们前面的人以交换位置。如果两个人交换位置,他们仍然会佩戴相同的标签,表示他们原来的位置。一个人最多可以贿赂另外两个人。例如,如果 n = 8 且第 5 个人贿赂第 4 个人,则队列将如下所示:{1, 2, 3, 5, 4, 6, 7, 8}。
对这个混乱的队列着迷,您决定必须知道为使队列进入当前状态而发生的最低贿赂次数!
public class LineBribing {
static int[] replace(int[] q, int i, int n) {
int temp = q[i];
q[i] = q[n];
q[n] = temp;
return q;
}
static void minimumBribes(int[] q) {
int count = 0;
for (int i = 0; i < q.length - 1; i++) {
if (q[i] > i + 3 || q[i] < i - 1) {
System.out.println("Too chaotic");
return;
}
if (q[i] > q[i + 1]) {
count++;
replace(q, i, i + 1);
i = 0;
}
}
System.out.println(count);
}
public static void main(String[] args) {
int[] test = {1, 2, 5, 3, 4, 7, 8, 6};
int[] test2 = {1, 2, 5, 3, 7, 8, 6, 4};
minimumBribes(test);
minimumBribes(test2);
}
}
鉴于 main 方法中的输入,测试 1 的输出应为 4(开关:5、3 在 index = 3 | 5、4 在 index = 4 | 8、6 在 index = q.length - 1 | 7, 6 at index = q.length - 2) 和测试 2 的“太混乱”(因为 5 > 2 从其初始位置切换)
【问题讨论】:
标签: java arrays bubble-sort