幼儿园有 N 个孩子玩游戏,随机围成了一个圈,老师最终想让所有男生排列到一起,所有女生排列到一起。每次老师可以命令两个孩子交换位置,求最小的命令次数用java代码实现
时间: 2023-08-13 08:08:18 浏览: 184
这道题可以使用环状数组和双指针来解决。
首先将男生和女生分别提取出来,然后将它们拼接在一起组成新的环状数组。接下来,我们使用双指针的方式,一个指向男生开始的位置,一个指向女生开始的位置,然后不断地向前移动指针,直到两个指针相遇。
在移动指针的过程中,如果发现男生和女生的位置不对,就将它们交换位置,并且记录下交换次数。最后返回交换次数即可。
以下是Java代码实现:
```java
public class Solution {
public int minSwaps(String children) {
char[] chars = children.toCharArray();
int n = chars.length;
// 提取男生和女生分别的位置
List<Integer> boys = new ArrayList<>();
List<Integer> girls = new ArrayList<>();
for (int i = 0; i < n; i++) {
if (chars[i] == 'B') {
boys.add(i);
} else {
girls.add(i);
}
}
// 构建新的环状数组
int[] nums = new int[n];
for (int i = 0; i < boys.size(); i++) {
nums[i] = boys.get(i);
}
for (int i = 0; i < girls.size(); i++) {
nums[boys.size() + i] = girls.get(i);
}
// 双指针
int i = 0, j = boys.size();
int count = 0;
while (i < boys.size() && j < n) {
if (nums[i] < nums[j]) {
i++;
} else {
j++;
count++;
}
}
return count;
}
}
```
阅读全文