题目:
已知一个由像素点组成的单色屏幕,每行均有 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]
解题思路:
本题实际就是将二维数组展开,变成了一维数组。题目中说明每32个像素点放在一个int中,w为每行的像素点总数,那么每行就有w/32个int,length为数组中一共有多少个int。
1.在定位x1和x2时,需要找到x1位于res中的哪个int,所以需要表示出一个偏移量:
y表示第几行,每行有row个int,所以y*row 先确定x1所在下标
再找到x1在当前这个int中是第几位,所以需要加上i/32
2.定位好x1的位置后,现在需要将x1-x2的位上的0变为1:
采用位运算:1 << (31 - (i % 32))
源代码如下:文章来源:https://www.toymoban.com/news/detail-660155.html
class Solution {
public:
vector<int> drawLine(int length, int w, int x1, int x2, int y) {
int row=w/32;//每行多少个int
vector<int> res(length,0);//初始化一维数组
//将x1-x2之间的位变为1
for(int i=x1;i<=x2&&i<length*32;i++)
{
//y*row+i/32 这个是偏移量,可以直接定位到x1所在的int里
//每次加的是(1 << (31 - (i % 32)))(最高位先访问)
//对1进行左移
res[y*row+i/32] |=(1<<(31-i%32));
}
return res;
}
};
文章来源地址https://www.toymoban.com/news/detail-660155.html
到了这里,关于leetcode原题:绘制直线(位运算)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!