首页 > 【百度】提前批Java研发一面面经
头像
程序员Hasity
编辑于 07-18 09:35 北京
+ 关注

【百度】提前批Java研发一面面经

一顿狂轰乱炸

zkxzhuzhu alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt alt

要实现这个功能,可以首先遍历数组一次来找到最大值和最小值以及它们的索引,然后再进行两次交换.

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开始寻找最大值和最小值,这种情况下的交换是无害的
    }
}

注意:

  • 这个方法首先遍历数组找到最大值和最小值的索引以及它们的值。
  • 然后,它检查这两个值是否已经在它们的目标位置(即最小值在数组的第一个位置,最大值在数组的最后一个位置)。
  • 如果不在,就进行相应的交换。
  • 这里有一个小的优化点:如果最大值已经在最后一个位置,且它不与最小值相同(即它们不是同一个索引),那么可以避免对最大值的第二次交换。但是,为了代码的清晰性和易读性,这里还是保持了两次可能的交换。
  • 需要注意的是,如果数组只有一个元素或为空,这个方法将直接返回,因为在这种情况下没有最小值或最大值的概念,或者没有位置可以交换。

alt

全部评论

(2) 回帖
加载中...
话题 回帖

近期热帖

近期精华帖

热门推荐