• 程序员面试金典-面试题 05.08. 绘制直线


    题目:

    绘制直线。有个单色屏幕存储在一个一维数组中,使得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;
        }
    }
  • 相关阅读:
    如何做竞品分析报告
    软件架构入门
    系统内部矛盾的解决思路
    分表分库一
    Hbase随笔2
    Hbase随笔
    vertica在电信的应用
    理解RESTful架构
    百分点刘译璟
    数据产品的简介
  • 原文地址:https://www.cnblogs.com/silentteller/p/12448828.html
Copyright © 2020-2023  润新知