面试题 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; } }

__EOF__

本文作者Younger
本文链接https://www.cnblogs.com/youngerwb/p/16290753.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   YoungerWb  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示