leetcode原题:绘制直线(位运算)

题目:

已知一个由像素点组成的单色屏幕,每行均有 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))

源代码如下:

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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值