题目链接:05.08. 绘制直线
首先解释一下题目
- length是一共多少个int,屏幕一共有length*32个像素点;
- w是当前屏幕宽度,单位是像素,除以32就是一行用多少个int表示;
- 高度是length*32 / w,实际计算没用;
代码:
def drawLine(self, length: int, w: int, x1: int, x2: int, y: int) -> List[int]:
"""
解题思路:1.先根据length初始化结果数组,元素全为0
2. 计算结果数组中第几个元素开始,值会发生改变,start
3. 将发生变化的元素用数组b_nums保存下来,这里需要将x1对应的像素向左扩展,x2向右扩展,使其能成为一个完整的32位像素
4. 遍历b_nums数组,每32个元素划分一次,利用基本的十进制和二进制转换的方法,将其转换为一个十进制数
:param length:
:param w:
:param x1:
:param x2:
:param y:
:return:
"""
# 先初始化结果数组,全为0
out = [0 for i in range(length)]
width = w // 32
height = length * 32 // width
# 计算从第几个元素开始需要更改结果数组
start = y * width + x1 // 32
b_nums = [] # 发生变化的二进制数组
for i in range(x1//32*32, x2//32*32+32):
if x1 <= i <= x2:
b_nums.append(1)
else:
b_nums.append(0)
# 一共几个元素发生了改变
count = len(b_nums) // 32
for i in range(count):
a = b_nums[i*32 : i*32+32]
positive_flag = True
# 判断是否为负数
if a[0] == 1:
positive_flag = False
# 减1操作
for j in range(31, -1, -1):
if a[j] == 0:
a[j] = 1
else:
a[j] = 0
break
#按位取反操作
for j in range(32):
if a[j] == 0:
a[j] = 1
else:
a[j] = 0
ten = 0
for k in range(32):
ten = ten + a[k] * pow(2, 31-k)
if not positive_flag:
ten = ten * (-1) # 负数需要乘以-1
out[start] = ten
start += 1
return out