【百度】提前批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

#软件开发笔面经#
校招面经大全 文章被收录于专栏

收录各个网友分享的各个公司的面经,并给出答案。

全部评论
老哥知道什么时候出结果吗已经等了一天了
点赞 回复 分享
发布于 2024-07-18 16:55 安徽
大佬觉得go怎么样,双非go是不是必死
点赞 回复 分享
发布于 2024-07-18 15:51 北京

相关推荐

上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
国企上岸了的向宇同桌...:最害怕答非所问了,但是频繁反问确定意思又害怕面试官觉得我笨
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
26
135
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务