2020-7-21 虾皮笔试题(测试岗,2题)

1、剑指 Offer 29. 顺时针打印矩阵
2、321、拼接最大数
第2题大神的题解:Java 拆分子问题 合并求解
做点笔记:

大致思路:

  • 假设最终结果有count个数(介于0~k之间)字在nums1中,那么有(k-count)个数字在nums2中,最外层循环遍历0到count的情况。不一定从0开始,若nums2个数不足k个,则从(k-nums2.length)开始。同样,不一定在count结束,若nums1个数不足k个,则在nums1.length结束。
  • 分别从nums1、nums2取最大子序列。可以借助栈来获取最大子序列,注意只有当数组剩余元素多余栈中剩余空间时,才能将栈中较小的元素出栈。
  • 合并两个子序列组成一个序列。可以借助双指针从头递进比较序列元素大小,注意比较时不能仅比较当前索引出元素,需按大数比较。
  • 比较合并后序列的大小是否大于已缓存的答案序列的大小,取大的作为答案序列。
  • 作者:chidehang
    链接:https://leetcode-cn.com/problems/create-maximum-number/solution/java-chai-fen-zi-wen-ti-he-bing-qiu-jie-by-chideha/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

根据大神的思路再解释一下关键点:
(1)分别求两个序列的最大子序列。
(2)序列num1中最大子序列长度为w,则num2中最大子序列长度为k-w。第一层循环遍历w的所有取值。w的取值为:Math.max(0,k-num2.length) ≤ w ≤ Math.min(k,num1.length)
(3)用两个指针分别对应两个子序列进行合并。(我已开始还想复杂了,我还想用归并排序来着)

你可能感兴趣的:(面试)