leetCode题目:
将两个有序整型数组,合并到另外一个数组中,并保持有序。
今天面试了一家公司,这家公司有在线笔试题。是一道很简单的题。但是我回答的非常糟糕:
问题是:将两个有序整型数组,合并到另外一个数组中,并保持有序。
下面是我写的,作为一个有这么多年经验的程序员,我都想抽自己的脸。这写的啥狗屁啊,感觉就跟刚学java一样。
冷静之后,发现问题出在3个方面:
1.基础知识不牢固,int[]竟然能忘了带[],我真的非常服了我自己,如果真是我每次写代码都手写而不是用IDE(IDE有编译提示功能),或者在学习一个东西的时候,刻意的用手写,我认为这个是可以避免的!
2.紧张,这是我第一次在线笔试,面试官在电话那边等了我10分钟,一开始我想用快速排序,结果中间被制止了。确实挺紧张的。
3.没有刷过题。虽然我思路是正确的,但是还是写的太慢了。
面试之后,该公司就把我回答的题目又发了过来,我就在我的IDEA上又完成了整个过程的编码,经历了几次简单的调试,最后得到正确的答案:
package com.List.LinkedList.app;
/*
复杂度问题:
时间复杂度 : O(n + m)
空间复杂度 : O(n + m)
*/
public class arrayMerge {
public static void main(String[] args) {
int[] a = new int[]{1, 3, 5, 6, 7, 9};
int[] b = new int[]{2, 4, 6, 8, 10};
int[] c = new int[a.length + b.length];
//声明两个指针,分别指向两个数组,随着指针的移动,进行比较,然后插入
//这次for循环会至少排完一个数组(a/b)。剩下的就单独进行插入
/*
对我的启发:
平时比较喜欢写
for(int i=0;i<table.length;i++){}
这种,很少有将指针变量放放到{}中去进行++的,所以,这个意识/习惯要刻意去练习!
*/
int i = 0, j = 0, k = 0;
for (; k < (c.length) && i < a.length && j < b.length; k++) {
if (a[i] <= b[j]) {
c[k] = a[i++];
} else {
c[k] = b[j++];
}
}
/*
剩余的数据进行插入
*/
while (i < a.length && k < c.length) {
c[k] = a[i++];
k++;
}
/*
剩余的数据进行插入
*/
while (j < b.length && k < c.length) {
c[k] = b[j++];
k++;
}
for (int l = 0; l < c.length; l++) {
System.out.print(c[l] + ((l==c.length-1)?"":","));
}
}
}
用的时间也不长,所以说,我其实能力没啥问题,主要还是上面提的三个问题。
下面就是leetCode的高效率的解题。
有趣的一点是,我在开始写的时候,我写的是,暴力将两个数组放到一个数组里面,然后就准备开始写快速排序…我都快写完了,发现,面试官悠悠的来了一句,不用想这么复杂,我才知道,我操他能看到我在线答题!卧槽!然后我就蠢蠢开始写我的傻瓜代码。
以下是leetCode这道题的最佳解法:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// two get pointers for nums1 and nums2
int p1 = m - 1;
int p2 = n - 1;
// set pointer for nums1
int p = m + n - 1;
// while there are still elements to compare
while ((p1 >= 0) && (p2 >= 0))
// compare two elements from nums1 and nums2
// and add the largest one in nums1
nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--];
// add missing elements from nums2
System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复杂度分析
时间复杂度 : O(n + m)O(n+m)。
空间复杂度 : O(1)O(1)。