题目:
绘制直线。有个单色屏幕存储在一个一维数组中,使得32个连续像素可以存放在一个 int 里。屏幕宽度为w,且w可被32整除(即一个 int 不会分布在两行上),屏幕高度可由数组长度及屏幕宽度推算得出。请实现一个函数,绘制从点(x1, y)到点(x2, y)的水平线。
给出数组的长度 length,宽度 w(以比特为单位)、直线开始位置 x1(比特为单位)、直线结束位置 x2(比特为单位)、直线所在行数 y。返回绘制过后的数组。
示例1:
输入:length = 1, w = 32, x1 = 30, x2 = 31, y = 0
输出:[3]
说明:在第0行的第30位到第31为画一条直线,屏幕表示为[0b000000000000000000000000000000011]
示例2:
输入:length = 3, w = 96, x1 = 0, x2 = 95, y = 0
输出:[-1, -1, -1]
分析:
这道题不是很好理解,可以把所返回的一维数组转换成二维来编号,如果length15,在y=1上画线,实际上就是对数组中,3,4,5这三个索引的数进行操作。可以利用
Integer.parseUnsignedInt(“11011”, 2);
将字符串转换成2进制数。
程序:
class Solution { public int[] drawLine(int length, int w, int x1, int x2, int y) { int[] res = new int[length]; int index = 1 + w / 32 * y; StringBuilder str = new StringBuilder(); for(int i = 0; i < w; ++i){ if(i >= x1 && i <= x2){ str.append(1); }else{ str.append(0); } if(i % 32 == 31){ res[index-1] = Integer.parseUnsignedInt(str.toString(), 2); str.setLength(0); index++; } } return res; } }