笔试记录 平安科技 20200918 算法

1个半小时,选择题(8道单选、11道多选),3道编程题

1. 圆圈上删数 (AC)

圆圈上有0 ~n-1 共n个数字,从0开始,每次从中删除第m个数字,求最后剩下的一个数字

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# @param n int整型 数列大小
# @param m int整型 删除位数
# @return int整型
#
class Solution:
    def JosephCircle(self, n, m):
        # write code here
        circle = [i for i in range(n)]
        ind = 0
        while len(circle) > 1:
            ind = (ind + m - 1) % len(circle)
            circle.pop(ind)

        return circle[0]

2. 合并两个有序数组 (AC)

类似于LeetCode 21. 合并两个有序链表

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# Get merged sorted list
# @param Input1 int整型一维数组 数组1
# @param Input2 int整型一维数组 数组2
# @return int整型一维数组
#
class Solution:
    def sorted_two_list(self , Input1 , Input2 ):
        # write code here
        ans = []
        while len(Input1) and len(Input2):
            if Input1[0] <= Input2[0]:
                ans.append(Input1[0])
                Input1.pop(0)
            else:
                ans.append(Input2[0])
                Input2.pop(0)
        if len(Input1):
            ans += Input1
        elif len(Input2):
            ans += Input2
        return ans

3. 找出两个正序数组的中位数 (AC)

复杂度 O ( log ⁡ ( m + n ) ) O(\log(m+n)) O(log(m+n))
log ⁡ \log log 说明得用二分查找,LeetCode 4. 寻找两个正序数组的中位数

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# @param nums1 int整型一维数组
# @param nums2 int整型一维数组
# @return float浮点型
#
class Solution:
    def findMedianSortedArrays(self, nums1, nums2):
        # write code here
        def getKthElement(k):
            ind1, ind2 = 0, 0
            while True:
                if ind1 == len1:
                    return nums2[ind2 + k - 1]
                if ind2 == len2:
                    return nums1[ind1 + k - 1]
                if k == 1:
                    return min(nums1[ind1], nums2[ind2])
                newind1 = min(ind1 + k // 2 - 1, len1 - 1)
                newind2 = min(ind2 + k // 2 - 1, len2 - 1)
                p1, p2 = nums1[newind1], nums2[newind2]
                if p1 < p2:
                    k -= newind1 - ind1 + 1
                    ind1 = newind1 + 1
                else:
                    k -= newind2 - ind2 + 1
                    ind2 = newind2 + 1

        len1 = len(nums1)
        len2 = len(nums2)
        total_l = len1 + len2
        if total_l % 2:
            return getKthElement((total_l + 1) >> 1)
        else:
            return (getKthElement(total_l // 2) + getKthElement(total_l // 2 + 1)) / 2.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

silenceagle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值