题目
绘制直线。有个单色屏幕存储在一个一维数组中,使得32个连续像素可以存放在一个 int 里。屏幕宽度为w,且w可被32整除(即一个 int 不会分布在两行上),屏幕高度可由数组长度及屏幕宽度推算得出。请实现一个函数,绘制从点(x1, y)到点(x2, y)的水平线。
给出数组的长度 length,宽度 w(以比特为单位)、直线开始位置 x1(比特为单位)、直线结束位置 x2(比特为单位)、直线所在行数 y。返回绘制过后的数组。
示例1:
输入:length = 1, w = 32, x1 = 30, x2 = 31, y = 0
输出:[3]
说明:在第0行的第30位到第31为画一条直线,屏幕表示为[0b000000000000000000000000000000011]
解题思路
位运算
代码
class Solution {
public int[] drawLine(int length, int w, int x1, int x2, int y) {
int[] ans = new int[length];
int size = length * 32, left = y * w + x1, right = y * w + x2, num = 0;
for (int i = 0; i < size; i++) {
int power = 31 - i % 32;
// 画线的区域,bit为1
if (i >= left && i <= right) num += 1 << power;
// 非画线区域,bit为0
else num += 0 << power;
// 每32位一个数字,0 ~ 31
if (i % 32 == 31) {
ans[i / 32] = num;
num = 0;
}
}
return ans;
}
}