题目来源:
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
参考:参考博客