面试题 05.08. 绘制直线-----位运算
题目表述
已知一个由像素点组成的单色屏幕,每行均有 w 个像素点,所有像素点初始为 0,左上角位置为 (0,0)。
现将每行的像素点按照「每 32 个像素点」为一组存放在一个 int 中,再依次存入长度为 length 的一维数组中。
我们将在屏幕上绘制一条从点 (x1,y) 到点 (x2,y) 的直线(即像素点修改为 1),请返回绘制过后的数组。
示例:
输入: length = 1, w = 32, x1 = 30, x2 = 31, y = 0
输出:[3]
解释:在第 0 行的第 30 位到第 31 位画一条直线,屏幕二进制形式表示为 [00000000000000000000000000000011],因此返回 [3]
位运算
就是相当于黑白屏幕,用一维数组来存储所有像素值:
-
length是一共多少个int,那么屏幕就是length*32个像素点;
-
w是当前屏幕宽度,单位是像素。除以32就是一行用多少个int表示;
-
高度就是length*32 / w,实际计算没啥用。y+1别超过这个值就可以;
-
题目要求画的就是一条直线。。高度就是y。。像素位置是从x1到x2;
-
图像的坐标是左上角为原点,水平向右x递增,水平向下是y递增;
class Solution {
public int[] drawLine(int length, int w, int x1, int x2, int y) {
int[] res = new int[length];
int num = w / 32;
for(int i = x1; i <= x2; i++){
int phase = i / 32 + y * num;
res[phase] += (1 << ( 31 - (i - phase * 32)));
}
return res;
}
}

浙公网安备 33010602011771号