之前看到一篇介绍字节跳动笔试题的文章
自己敲了点代码实现了其中两个。
首先题目如下图:(来自源文章)
题目2 单向链表表示10进制数,并实现加法操作。
主要思路:定义一个链表,每个节点表示一位数,最高位是链表头节点。每个节点有三个属性:number,id_idx,next 分布表示当前节点的数字(0~9),当前节点的位数(个位为1,十位为2,依次类推。)和下一个节点的链接。
实现加法计算时采用递归方式,先把当前节点的低位计算好得到结果后检查是否需要进位。如需进位就新建节点作为新的链表头。
题目三,台阶之间积水问题
算法描述如下:
- a 是存储台阶级数的数组,n为最大下标,Q为积水量,初始Q=0。首先从a中找到第一个不是0的元素下标i。考察边界值,如果i不存在,则结束
- 如果i>=n,结束,返回Q。否则从数组片段a[i:n]中找到第一个下标值j,使得a[j]>=a[i]。如果j不存在,说明当前台阶旁边不能装水,修改i = i + 1,重复步骤2
- 如果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)