python实现RGB字符串,按24位对齐后输出对应Integer行数字

题目来源:

2021届字节跳动算法岗笔试题

题目描述:

实现一个RGB字符串(如:rgb(0, 50,255) ),按24位数字对齐后输出对应Integer型数字。R为高位,B为低位。
例如:输入 rgb(0, 50,255) ,输出13055

输入描述:

字符串(如:rgb(0, 50,255) )

输出描述:

输出 number (如:11111)

示例1

输入
rgb(192, 192, 192)
输出
12632256

代码

话不多说直接上代码
思路:题目要求按24位对齐转换,由此想到先把对应r,g,b位的Integer数字转换成16进制,因为r,g,b的取值范围是0-255,大于255也会按255算。正好对应十六进制0x00-0xff,一位16进制又对应4位二进制,六个16进制刚好是24位。之后把转换好的16进制转换为int型就可以了。
当然你也可以把r,g,b位的Integer数字直接转换成三个8位的二进制这样来算。

小提示:
格式化输出 %
%o —— oct 八进制
%d —— dec 十进制
%x —— hex 十六进制

% 不支持二进制转换,

要想实现直接输出二进制可使用 format 函数来实现,或者自己根据需求编写个二进制转换函数。

def RGB_to_Int(Red,Green,Blue):
    r, g, b = (Red, Green, Blue)
    packed = int('%02x%02x%02x' % (r, g, b), 16)
    print(packed)

if __name__ == "__main__":
    arr = input("输入数组:")
    #截取字符串
    str=arr[4:-1]
    #获取其中的数字
    str2=str.split(',')
    #把str转为int,.strip()去除字符串首尾空格
    Red=int(str2[0].strip())
    Green=int(str2[1].strip())
    Blue=int(str2[2].strip())
    #调用
    RGB_to_Int(Red,Green,Blue)

在这里插入图片描述

参考:RGB Int to RGB - Python

容易有疑问的地方

1.字符串中 百分号02x 是什么意思

1)首先该结构符合字符串格式化输出的形式:

  • “%x%x%x” % (r,g,b)
  • 其中 %x 是十六进制整数

2)其次 %02x 是对 %x 的进一步补充:
% 作为格式化输出的格式符,可以用如下的方式进一步控制:

  • %[(name)][flags][width].[precision]typecode
  • (name)为命名;
  • flags可以有+,-,’ ‘或0。+表示右对齐。-表示左对齐。’
    '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填充;
  • width表示显示宽度;
  • precision表示小数点后精度;

所以此处 %02x 表示宽度为 2 的十六进制整数、不够 2 位用 0 填充
3)再回顾整体的 “#%02x%02x%02x” 其实就是类似 “#b7bb96” 等 rgb 颜色数据

参考:参考博客

2.%02x与%2x 之间的区别
1)输出最小宽度

  • 用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0(当最小宽度数值以0开头时)。
  • X 表示以十六进制形式输出
  • 02 表示不足两位,前面补0输出;如果超过两位,则实际输出

举例:
printf("%02X", 0x345); //打印出:345
printf("%02X", 0x6); //打印出:06

  • 而如果直接写为 %2x,数据不足两位时,实际输出,即不额外补0输出; 如果超过两位,则实际输出。

printf("%2X", 0x345); //打印出:345
printf("%2X", 0x6); //打印出:6

参考:参考博客

猜你喜欢

转载自blog.csdn.net/zhuyin6553/article/details/109278107