当前位置: 首页 > news >正文

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;//每行多少个intvector<int> res(length,0);//初始化一维数组//将x1-x2之间的位变为1for(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;}
};

 

http://www.lryc.cn/news/129905.html

相关文章:

  • jenkins 安装和通过gitee 拉取PHP项目
  • 解析TCP/IP协议的分层模型
  • ARM M33架构入门
  • CentOS系统环境搭建(四)——Centos7安装Java
  • Arduino MQTT客户端库PubSubClient快速入门
  • 视频集中存储/云存储/磁盘阵列EasyCVR平台接入RTSP设备出现离线情况的排查
  • 部署Springboot项目注意事项
  • 深度解析:DDoS攻击与先进防御策略
  • NLP | 论文摘要文本分类
  • Linux / Ubuntu磁盘扩容
  • 【ChatGPT 指令大全】怎么使用ChatGPT来辅助知识学习
  • URL编码指南
  • Java mail邮件开发 OA办公系统
  • ElasticSearch的客户端操作
  • 如何快速的合并多个PPT使之成为一个PPT?
  • 【微信小程序】列表滚动触底更新实现
  • 2023全国大学生数学建模竞赛A题B题C题D题E题思路+模型+代码+论文
  • Git常见操作
  • thinkphp6前后端验证码分离以及验证
  • jenkinsfile自动部署接口
  • 26. 删除有序数组中的重复项
  • vue父页面获取子组件绑定值
  • FPGA_学习_17_IP核_ROM(无延迟-立即输出)
  • CentOS7.6安装mysql8.0.34
  • SCF金融公链新加坡启动会 链结创新驱动未来
  • JavaScript【实例、静态方法与属性、原型链、instanceof 运算符、Object 对象的相关方法、对象的继承、多重继承、严格模式】(十九)
  • 【Git】本地搭建Gitee、Github环境
  • 学习ts(四)联合类型、交叉类型、类型断言
  • Linux 内核与架构速查
  • 【Java 动态数据统计图】动态数据统计思路案例(动态,排序,containsKey)五(117)