【笔试代码题记录】20190728拼多多

【第一题】
给定数组A和B,数组A是几乎严格升序的,几乎的定义是只需改变其中一个数,即可满足完全升序序列。
要求:从A中找到这个数字,并从B中选取一个数字将其替换,使得数组A是严格升序的。(不允许相邻两个为相同的数)。请找出B中满足要求的最大数字,并输出最终有序的数组。如果不存在就输出NO。

我的思路(通过率75%):遍历A数组,找到a[i] >= a[i-1]的位置,然后记录a[i-1]和a[i+1]的值,在数组B中查找是否存在该范围内的值。

看到的一个100%通过率思路:在找到a[i] >= a[i+1]的位置后,先看看能不能换掉i+1位置的数,让数组a有序(因为要找b中最大的数),如果不行,就看能不能换掉i位置的数让数组a有序,如果还是不行就输出NO。

对比区别:比如A数组为[1,20, 5, 40], 当找到5这个数字之后,我的做法是直接把5替换掉,也就是在B中找[21,39]范围内的数,找不到直接返回No了。但是参考的解法里面,先尝试换掉5(因为先换后面的能保证整个数组尽可能的大),也就是说只要B数组中存在[21, 39]的数字,都是可以的;如果换掉5不可行,再尝试换掉20,在B中找[1,4]范围内的数.(思路很巧妙)

def func(nums1, nums2):
    if not nums1 or not nums2:
        print('NO')
    index = 0
    min_value, max_value = float('-inf'), float('inf')
    flag1 = False # 替换掉波谷的那个数(最小的数)
    flag2 = False  # 替换掉波谷前面那个大的数
    for i in range(1, len(nums1)):
        if nums1[i] < nums1[i - 1]:
            min_value = nums1[i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值