面试题 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;
    }
}
posted @ 2022-05-19 23:33  YoungerWb  阅读(49)  评论(0)    收藏  举报