LeetCode20200805

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值