Python实现字节跳动笔试题单链表十进制和台阶积水问题

本文介绍了如何使用Python解决字节跳动笔试中的两道题目:一是用单链表表示10进制数并进行加法操作,通过定义链表节点结构并采用递归方式实现;二是解决台阶积水问题,通过遍历数组寻找符合条件的台阶并计算积水。
摘要由CSDN通过智能技术生成

之前看到一篇介绍字节跳动笔试题的文章
自己敲了点代码实现了其中两个。
首先题目如下图:(来自源文章
来自原文的笔试题目截图
题目2 单向链表表示10进制数,并实现加法操作。
主要思路:定义一个链表,每个节点表示一位数,最高位是链表头节点。每个节点有三个属性:number,id_idx,next 分布表示当前节点的数字(0~9),当前节点的位数(个位为1,十位为2,依次类推。)和下一个节点的链接。
实现加法计算时采用递归方式,先把当前节点的低位计算好得到结果后检查是否需要进位。如需进位就新建节点作为新的链表头。

题目三,台阶之间积水问题
算法描述如下:

  1. a 是存储台阶级数的数组,n为最大下标,Q为积水量,初始Q=0。首先从a中找到第一个不是0的元素下标i。考察边界值,如果i不存在,则结束
  2. 如果i>=n,结束,返回Q。否则从数组片段a[i:n]中找到第一个下标值j,使得a[j]>=a[i]。如果j不存在,说明当前台阶旁边不能装水,修改i = i + 1,重复步骤2
  3. 如果j存在,计算积水量 Q+=sum(a[i]-a[k]) k属于[i+1,j-1]。修改i=j,重复2

上代码:

“”
单链表十进制问题
“”
class NumberNode():
    def __init__(self, number, pos_id):
        self.number = number
        self.next = None
        self.pos_id = pos_id

    def print(self):
        number = [str(self.number)]
        next = self.next
        while next is not None:
            number.append(str(next.number))
            next = next.next
        print(''.join(number))

    @classmethod
    def Add(cls, number1, number2):
        if number1.pos_id >= number2.pos_id:
            big_number = number1
            small_number = number2
        else:
            big_number = number2
            small_number = number1
        if big_number.next is None:
            sum = big_number.number + small_number.number
            if sum < 10:
                big_number.number = sum
            else:
                newNumber = NumberNode(sum // 10, big_number.pos_id + 1)
                big_number.number = sum % 10
                newNumber.next = big_number
                big_number = newNumber
            return big_number
        next_big = big_number.next
        if big_number.pos_id == small_number.pos_id:
            next_small = small_number.next
        else:
            next_small = small_number
        result = cls.Add(next_big, next_small)
        sum = big_number.number
        if result.pos_id == big_number.pos_id:
            sum += result.number
        if big_number.pos_id == small_number.pos_id:
            sum += small_number.number
        if sum > 10:
            newnumber = NumberNode(sum // 10, big_number.pos_id + 1)
            big_number.number = sum % 10
            newnumber.next = big_number
            big_number = newnumber
        else:
            big_number.number = sum
        return big_number

    @classmethod
    def CreateFromStr(cls, str):
        pos_id = len(str)
        number = None
        for s in str:
            if number == None:
                number = NumberNode(int(s), pos_id)
                prev_number = number
            else:
                new_number = NumberNode(int(s), pos_id)
                prev_number.next = new_number
                prev_number = new_number
            pos_id -= 1
        return number


if __name__ == '__main__':
    a = NumberNode.CreateFromStr("9934")
    b = NumberNode.CreateFromStr("980")
    c = NumberNode.Add(a, b)
    c.print()


‘’‘

“”
积水问题
“”
```python
def CountRain(stairs):
    if not isinstance(stairs, (list)) or len(stairs) == 0:
        return 0
    rain_count = 0
    i = 0

    stair_len = len(stairs)
    while i < stair_len:
        if stairs[i] == 0:
            i += 1
            continue
        j = 0
        for k in range(i + 1, stair_len):
            if stairs[k] >= stairs[i]:
                j = k
                break
        if j == 0:
            i += 1
            continue
        for k in range(i + 1, j):
            rain_count += (stairs[i] - stairs[k])
        i = j
    return rain_count


if __name__ == '__main__':
    count = CountRain([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1,3,0,5])
    print(count)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值