问题描述

要求

示例输入

示例输出

解决思路

代码解析

参考代码

总结

用Java实现合并两个有序数组,面试常见问题

小葵

2024-05-30

🏷

java面试题

问题描述

给定两个有序整数数组 nums1nums2,其中 nums1 的长度为 m``,nums2 的长度为 n。将 nums2 合并到 nums1 中,使最终的数组 nums1 成为有序的

要求

  1. 接受两个有序整数数组 nums1nums2 作为输入
  2. nums2 合并到 nums1 中,并返回合并后的有序数组
  3. 你可以假设 nums1 的空间大小等于 m + n,这样就不需要额外的空间来存储结果
  4. nums1nums2 的元素都是非负整数
  5. nums1nums2 的元素个数分别为 mn

示例输入

nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

示例输出

[1,2,2,3,5,6]

解决思路

因为两个数组都是有序的,那么我们可以从后往前遍历两个数组,比较大小:

  1. 遍历合并:从后往前遍历两个数组,比较大小,将较大的数放到 nums1 的末尾
  2. 处理剩余元素:如果 nums2 还有剩余元素,将剩余元素放到 nums1 的前面

代码解析

merge

  1. 第6-10行: 从后往前遍历两个数组,比较大小,重新排序存储到 nums1
  2. 第14行: 如果 nums2 还有剩余元素,将剩余元素放到 nums1 的前面

参考代码

public class Compressor {
    // 压缩字符串, 返回压缩后的字符串
    // Author: ruzhila.cn
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m - 1;
        int p2 = n - 1;
        int p = m + n - 1;

        while ((p1 >= 0) && (p2 >= 0)) {
            if (nums1[p1] < nums2[p2]) {
                nums1[p--] = nums2[p2--];
            } else {
                nums1[p--] = nums1[p1--];
            }
        }

        while (p2 >= 0) {
            nums1[p--] = nums2[p2--];
        }
    }

    public static void main(String[] args) {
        String s = "aaabbbcc";
        StringCompressor compressor = new StringCompressor();

        int[] nums1 = { 1, 2, 3, 0, 0, 0 };
        int[] nums2 = { 2, 5, 6 };
        compressor.merge(nums1, 3, nums2, 3);
        for (Integer num : nums1) {
            System.out.print(num + " ");
        }
        // Output: 1 2 2 3 5 6
    }
}

总结

这段代码实现了合并两个有序数组的算法,排序和遍历是算法中常见的操作,大家要理解算法的要求和实现

后端开发中经常需要对数组进行合并,如果你的算法错误,会导致严重的问题,所以要多练习这类算法题

欢迎大家关注 入职啦 (公众号: ruzhila) ,获取更多有趣的编程挑战题和技术干货!

所有的后端面试常见的问题,我们每天都会在我们的编程群里面讨论和Code review, 欢迎大家加入我们的编程群,一起学习和进步。

编程交流群

友情链接:

Copyright© 2024 杭州园中葵科技有限公司 版权所有