最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

【华为OD机试真题JAVA】数组按规则合并问题 题目及解析

IT圈 admin 68浏览 0评论

2024年2月15日发(作者:山君豪)

【华为OD机试真题JAVA】数组按规则合并问题 题目及解析

题目:

有两个有序数组A和B,长度分别为n和m,需要将它们合并为一个有序数组C并去重,其中规则如下:

1. 如果A[i]和B[j]相同,则只保留一个。

2. 如果A[i]和B[j]不相同,则将较小的数插入到C中,同时i和j指针都向后移动一位,直到其中一个指针到达末尾为止。

3. 如果A还有剩余,则将剩余元素全部插入到C中; 如果B还有剩余,则将剩余元素全部插入到C中。

要求:时间复杂度O(n+m),空间复杂度O(1)。

解析:

该问题在数据结构和算法中经常被用到,其解法主要有双指针法和归并排序。这里介绍一种基于双指针的解法。

首先,定义三个指针:i、j和k,分别指向数组A、数组B和数组C的当前最小元素。然后,根据规则比较A[i]和B[j]的大小,将较小的数插入到C[k]中,并将对应指针向后移动一个位置,直到其中一个指针到达末尾为止,即A[i]或B[j]到了数组的最后一个元素。

最后,将剩余元素全部插入到C中,即如果A还有元素没处理,则将A中的所有元素插入到C中;如果B还有元素没处理,则将B中的所有元素插入到C中。

代码实现如下:

public static int[] merge(int[] nums1, int[] nums2) {

int n1 = , n2 = , k = 0;

int[] nums = new int[n1 + n2];

int i = 0, j = 0;

while (i < n1 && j < n2) {

if (nums1[i] == nums2[j]) {

nums[k++] = nums1[i];

i++;

j++;

} else if (nums1[i] < nums2[j]) {

nums[k++] = nums1[i];

i++;

} else {

nums[k++] = nums2[j];

j++;

}

}

while (i < n1) {

nums[k++] = nums1[i++];

}

while (j < n2) {

nums[k++] = nums2[j++];

}

return (nums, k);

}

时间复杂度分析:

双指针遍历两个数组的时间复杂度为O(n+m),空间复杂度为O(1)。最后将结果拷贝到新的数组中的时间复杂度为O(k),其中k为结果数组的长度,即去重后的元素个数。因此,总时间复杂度为O(n+m+k)。

2024年2月15日发(作者:山君豪)

【华为OD机试真题JAVA】数组按规则合并问题 题目及解析

题目:

有两个有序数组A和B,长度分别为n和m,需要将它们合并为一个有序数组C并去重,其中规则如下:

1. 如果A[i]和B[j]相同,则只保留一个。

2. 如果A[i]和B[j]不相同,则将较小的数插入到C中,同时i和j指针都向后移动一位,直到其中一个指针到达末尾为止。

3. 如果A还有剩余,则将剩余元素全部插入到C中; 如果B还有剩余,则将剩余元素全部插入到C中。

要求:时间复杂度O(n+m),空间复杂度O(1)。

解析:

该问题在数据结构和算法中经常被用到,其解法主要有双指针法和归并排序。这里介绍一种基于双指针的解法。

首先,定义三个指针:i、j和k,分别指向数组A、数组B和数组C的当前最小元素。然后,根据规则比较A[i]和B[j]的大小,将较小的数插入到C[k]中,并将对应指针向后移动一个位置,直到其中一个指针到达末尾为止,即A[i]或B[j]到了数组的最后一个元素。

最后,将剩余元素全部插入到C中,即如果A还有元素没处理,则将A中的所有元素插入到C中;如果B还有元素没处理,则将B中的所有元素插入到C中。

代码实现如下:

public static int[] merge(int[] nums1, int[] nums2) {

int n1 = , n2 = , k = 0;

int[] nums = new int[n1 + n2];

int i = 0, j = 0;

while (i < n1 && j < n2) {

if (nums1[i] == nums2[j]) {

nums[k++] = nums1[i];

i++;

j++;

} else if (nums1[i] < nums2[j]) {

nums[k++] = nums1[i];

i++;

} else {

nums[k++] = nums2[j];

j++;

}

}

while (i < n1) {

nums[k++] = nums1[i++];

}

while (j < n2) {

nums[k++] = nums2[j++];

}

return (nums, k);

}

时间复杂度分析:

双指针遍历两个数组的时间复杂度为O(n+m),空间复杂度为O(1)。最后将结果拷贝到新的数组中的时间复杂度为O(k),其中k为结果数组的长度,即去重后的元素个数。因此,总时间复杂度为O(n+m+k)。

发布评论

评论列表 (0)

  1. 暂无评论