2023/8/29 B站开发工程师(工程效率方向)笔试编程题

Python代码实现

1.排序去重

给定一个升序排列的的长度为 n 的数组 nums,数组中每个元素都是正整数,

请删除一部分这个数组的重复元素(数组元素需要原地改变),

让这个数组中的每个数字都严格大于前一个数(第一个数除外),

然后返回删除过后该数组的长度。

假设你返回长度是 m。如果 m 是正确答案,修改后的数组 nums 有 m 或 m 个以上个元素,并且前 m 个元素符合要求,那么你的代码将被判为正确。

例如n=4,nums=[1,2,2,3],则输出3。

例如n=5,nums=[1,1,22,30,41],则输出4。


class Solution:
    def del_repeat_item(self, n: int, nums) -> int:
        for i in range(n - 1, 0, -1):
            if nums[i] <= nums[i - 1]:
                nums.pop(i)
        return len(nums)


ret = Solution().del_repeat_item(4, [1, 2, 2, 3])
print(ret)

2.蛇形矩阵

编写算法, 将自然数 1~n^2 按“ 蛇形” 填入 n× n 矩阵中。例如n=4时,自然数1~4^2 填入4 x 4矩阵后:

1 12 11 10

2 13 16 9

3 14 15 8

4 5 6 7


class Solution:
    def print_snake_matrix(self, n: int):
        # 创建一个空的 n x n 矩阵
        matrix = [[0] * n for _ in range(n)]
        # 最大值
        max_num = n ** 2
        # 当前值
        matrix[0][0] = temp_num = 1
        i = j = 0
        # 值未填满
        while temp_num < max_num:
            # 下
            while i + 1 < n and matrix[i + 1][j] == 0:
                i += 1
                temp_num += 1
                matrix[i][j] = temp_num
            # 右
            while j + 1 < n and matrix[i][j + 1] == 0:
                j += 1
                temp_num += 1
                matrix[i][j] = temp_num
            # 上
            while 0 <= i - 1 < n and matrix[i - 1][j] == 0:
                i -= 1
                temp_num += 1
                matrix[i][j] = temp_num
            # 左
            while 0 <= j - 1 < n and matrix[i][j - 1] == 0:
                j -= 1
                temp_num += 1
                matrix[i][j] = temp_num
            # print(i, j)
            # print(temp_num, max_num)
        return matrix


ret = Solution().print_snake_matrix(4)
print(ret)

3.平均数最大长度为K的连续子数组

给定一个长度为n的数组,数组中每个元素都是整数,找到其中平均数最大的长度为k连续子数组。请你输出该子数组所有元素的平均数。

例如输入n=4,k=2,数组为[1,2,3,1],则输出2.50。

注意:遇到不符合预期的输入时,返回0.00。

示例1输入输出示例仅供调试,后台判题数据一般不包含示例

输入4,2,[1,2,3,1]

输出2.50

class Solution:
    def cal_max_avg_for_sub_list(self, n, k, nums) -> float:
        # 前k个数字和
        temp_sum = max_sum = sum(nums[:k])
        # 循环拿 k至最后一个数字
        for i in range(k, n):
            # 减去的是最左边的
            temp_sum += nums[i] - nums[i - k]
            max_sum = max(max_sum, temp_sum)
        return max_sum / k


ret = Solution().cal_max_avg_for_sub_list(4, 2, [1, 2, 3, 1])
print(ret)

全部评论

相关推荐

最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务