LeetCode 面试题 05.08. 绘制直线

一、题目

  已知一个由像素点组成的单色屏幕,每行均有 w 个像素点,所有像素点初始为 0,左上角位置为 (0,0)。

  现将每行的像素点按照「每 32 个像素点」为一组存放在一个 int 中,再依次存入长度为 length 的一维数组中。

  我们将在屏幕上绘制一条从点 (x1,y) 到点 (x2,y) 的直线(即像素点修改为 1),请返回绘制过后的数组。

注意:

  • 用例保证屏幕宽度 w 可被 32 整除(即一个 int 不会分布在两行上)

示例1:

输入: length = 1, w = 32, x1 = 30, x2 = 31, y = 0
输出: [3]
解释: 在第 0 行的第 30 位到第 31 位画一条直线,屏幕二进制形式表示为 [00000000000000000000000000000011],因此返回 [3]

示例2:

输入: length = 3, w = 96, x1 = 0, x2 = 95, y = 0
输出: [-1, -1, -1]
解释: 由于二进制 11111111111111111111111111111111 的 int 类型代表 -1,因此返回 [-1,-1,-1]

提示:

  • 1 <= length <= 10^5
  • 1 <= w <= 3 * 10^5
  • 0 <= x1 <= x2 < w
  • 0 <= y <= 10

  点击此处跳转题目

二、Java 题解

  确定左右端点后,依据位置进行赋值即可,具体代码如下:

class Solution {
    public int[] drawLine(int length, int w, int x1, int x2, int y) {
        int[] ans = new int[length];
        int col = w / 32, start = x1 / 32 + y * col, end = x2 / 32 + y * col;
        int left = (x1 % 32 == 0 ? 0 : 1 << (32 - x1 % 32)) - 1;
        int right = -(1 << (31 - x2 % 32));
        if (start == end) ans[start] = left + right + 1;
        else {
            ans[start] = left;
            for (int i = start + 1; i < end; i++) ans[i] = -1;
            ans[end] = right;
        }

        return ans;
    }
}
  • 时间:0 ms,击败 100.00% 使用 Java 的用户
  • 内存:40.81 MB,击败 95.08% 使用 Java 的用户
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔗理苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值