题目解析 60. RGB色值转换为整数值 | 豆包MarsCode AI刷题

112 阅读4分钟

RGB颜色值广泛应用于计算机图形学中,通常表示为三种颜色(红、绿、蓝)的组合。每种颜色值通常取值范围在0,2550, 255之间,表示颜色的强度。将RGB格式的颜色值转换为十六进制整数值是一个常见的需求,例如在处理颜色编码、存储颜色数据或实现颜色值运算时。

本题的目标是将一个以"rgb(r, g, b)"字符串表示的RGB颜色值转换为其对应的十六进制整数表示。


问题拆解

  1. 输入格式

    • 输入是一个形如"rgb(r, g, b)"的字符串,rgb分别为红、绿、蓝三个通道的颜色值。
    • 每个值在字符串中用逗号分隔,且可能包含多余的空格。
  2. 输出格式

    • 返回一个整数,表示该RGB值对应的十六进制颜色值。
  3. 转换原理

    • RGB值本质上是一个24位的数:

      • 红色部分占最高的8位(16-23位)。
      • 绿色部分占中间的8位(8-15位)。
      • 蓝色部分占最低的8位(0-7位)。
    • 十六进制颜色值的计算公式是: Hex Value=(R≪16)+(G≪8)+B\text{Hex Value} = (R \ll 16) + (G \ll 8) + B 其中,RGB分别为红、绿、蓝值,<<表示左移操作。


实现步骤

为了将输入字符串成功转换为整数,我们可以按以下步骤实现:

  1. 提取有效的RGB部分

    • RGB字符串中包含冗余的部分,例如"rgb("),这些需要去除。
    • 利用字符串切片操作去掉冗余字符,同时使用strip()方法去掉可能存在的额外空格。
  2. 分割并解析RGB值

    • 去掉冗余后,RGB值被逗号分隔成三个部分。我们可以利用字符串的split(',')方法分割字符串,得到一个包含三个值的列表。
    • 每个值需要转换为整数类型,使用map(int, ...)来批量完成转换。
  3. 计算十六进制整数值

    • 按照公式: Hex Value=(R≪16)+(G≪8)+B\text{Hex Value} = (R \ll 16) + (G \ll 8) + B 将三个颜色值进行位操作并相加。

代码实现详解

以下是问题的完整解决代码:

def solution(rgb):
    # 从字符串中提取RGB部分
    rgb = rgb.strip()  # 去掉前后空白
    rgb = rgb[4:-1]    # 去掉"rgb("和")"
    
    # 将RGB字符串分割成单独的R, G, B值,并转换为整数
    r, g, b = map(int, rgb.split(','))
    
    # 将RGB值合并为一个整数
    return (r << 16) + (g << 8) + b
关键步骤解析:
  1. 去掉冗余字符

    rgb = rgb.strip()  # 去掉输入字符串两端可能存在的空白字符
    rgb = rgb[4:-1]    # 去掉前面的"rgb("和后面的")"
    

    如果输入是"rgb(192, 192, 192)",经过以上处理后得到:

    rgb = "192, 192, 192"
    
  2. 分割和类型转换

    r, g, b = map(int, rgb.split(','))
    
    • rgb.split(',')将字符串分割为['192', ' 192', ' 192']
    • 使用map(int, ...)将分割后的字符串转换为整数,最终得到r = 192, g = 192, b = 192
  3. 颜色值组合

    return (r << 16) + (g << 8) + b
    
    • 将红色值左移16位,变为最高的8位;
    • 将绿色值左移8位,位于中间8位;
    • 蓝色值保持在最低的8位;
    • 最终结果为十六进制整数值。

测试与验证

"rgb(192, 192, 192)"为例:

  1. 处理后的r = 192, g = 192, b = 192
  2. 计算: (192≪16)+(192≪8)+192=12582912+49152+192=12632256(192 \ll 16) + (192 \ll 8) + 192 = 12582912 + 49152 + 192 = 12632256

结果与预期一致。


时间复杂度与空间复杂度

  1. 时间复杂度

    • 字符串处理、分割和映射操作的复杂度为O(1)(常量时间,因为字符串长度固定)。
    • 位运算的复杂度也是O(1)。
  2. 空间复杂度

    • 使用了固定数量的变量,空间复杂度为O(1)。