【百度】提前批Java研发一面面经
一顿狂轰乱炸
要实现这个功能,可以首先遍历数组一次来找到最大值和最小值以及它们的索引,然后再进行两次交换.
public class ArrayMinMaxSwap {
public static void main(String[] args) {
int[] nums = {5, 3, 8, 4, 2};
swapMinMax(nums);
for (int num : nums) {
System.out.print(num + " ");
}
}
public static void swapMinMax(int[] nums) {
if (nums == null || nums.length < 2) {
return;
}
int minIndex = 0;
int maxIndex = 0;
int min = nums[0];
int max = nums[0];
// 找出最小值和最大值的索引
for (int i = 1; i < nums.length; i++) {
if (nums[i] < min) {
min = nums[i];
minIndex = i;
}
if (nums[i] > max) {
max = nums[i];
maxIndex = i;
}
}
// 如果最大值或最小值已经在正确的位置,则不需要交换
if (minIndex != 0) {
// 将最小值交换到数组的第一个位置
int temp = nums[0];
nums[0] = min;
nums[minIndex] = temp;
}
if (maxIndex == nums.length - 1 || (maxIndex != 0 && maxIndex != minIndex)) {
// 如果最大值已经在最后一个位置,或者最大值和最小值不是同一个元素,则交换
int temp = nums[nums.length - 1];
nums[nums.length - 1] = max;
nums[maxIndex] = temp;
}
// 注意:如果最大值和最小值相同且都在第一个位置,则上面的代码会进行不必要的交换然后恢复原位
// 但由于总是从索引1开始寻找最大值和最小值,这种情况下的交换是无害的
}
}
注意:
- 这个方法首先遍历数组找到最大值和最小值的索引以及它们的值。
- 然后,它检查这两个值是否已经在它们的目标位置(即最小值在数组的第一个位置,最大值在数组的最后一个位置)。
- 如果不在,就进行相应的交换。
- 这里有一个小的优化点:如果最大值已经在最后一个位置,且它不与最小值相同(即它们不是同一个索引),那么可以避免对最大值的第二次交换。但是,为了代码的清晰性和易读性,这里还是保持了两次可能的交换。
- 需要注意的是,如果数组只有一个元素或为空,这个方法将直接返回,因为在这种情况下没有最小值或最大值的概念,或者没有位置可以交换。
校招面经大全 文章被收录于专栏
收录各个网友分享的各个公司的面经,并给出答案。