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

112 阅读2分钟

题目回顾:

要实现将RGB颜色值转换为相应的十六进制整数值的功能,我们可以按照以下步骤进行:

  1. 从输入字符串中提取出R、G、B三个分量的值。
  2. 将每个分量的值转换为16进制,并组合成一个完整的16进制颜色值。
  3. 将这个16进制颜色值转换为十进制整数。

这里有两个解法,我是使用js解这题的,一种使用了js内置的api因此很简洁,但是解算法尽可能不使用api,因此还有一种不使用的

使用api:

function solution(rgb) {
    // 去掉字符串中的"rgb("和")",然后分割得到R, G, B三个分量
    const [r, g, b] = rgb.slice(4, -1).split(', ').map(Number);
    
    // 将R, G, B三个分量组合成一个16进制颜色值
    const hexColor = (r << 16) | (g << 8) | b;
    
    return hexColor;
}

function main() {

    console.log(solution("rgb(192, 192, 192)") === 12632256); 
    console.log(solution("rgb(100, 0, 252)") === 6553852);    
    console.log(solution("rgb(33, 44, 55)") === 2174007);      
    console.log(solution("rgb(255, 255, 255)") === 16777215);  
    console.log(solution("rgb(0, 0, 0)") === 0);              
}

main();
  1. 解析字符串

    • 从输入的字符串中提取出 R、G、B 三个分量的值。
    • 字符串的格式是固定的:"rgb(R, G, B)",其中 R、G、B 是 0 到 255 之间的整数。
  2. 使用内置方法

    • 使用 slice 方法去掉 "rgb("")" 部分。
    • 使用 split 方法将剩下的字符串按逗号和空格分割成一个数组。
    • 使用 map 方法将数组中的每个字符串转换为整数。
  3. 组合成整数

    • 将 R、G、B 三个分量组合成一个 24 位的整数。
    • R 分量左移 16 位,G 分量左移 8 位,B 分量保持不变,然后进行按位或操作。

详细步骤

  1. 去掉 "rgb("")" 部分

    • 使用 slice(4, -1) 方法去掉字符串中的 "rgb("")" 部分,得到中间的数字部分。例如,"rgb(192, 192, 192)" 变成 "192, 192, 192"
  2. 分割得到 R、G、B 三个分量

    • 使用 split(', ') 方法将剩下的字符串按逗号和空格分割成一个数组。例如,"192, 192, 192" 变成 ["192", "192", "192"]
    • 使用 map(Number) 方法将数组中的每个字符串转换为整数。例如,["192", "192", "192"] 变成 [192, 192, 192]
  3. 组合成整数

  • 使用位移操作将 R、G、B 三个分量组合成一个 24 位的整数。

  • r << 16:将 R 分量左移 16 位。

  • g << 8:将 G 分量左移 8 位。

  • b:B 分量保持不变。

  • (r << 16) | (g << 8) | b:将这三个值进行按位或操作,得到最终的 24 位整数。

不使用太多内置的api方法:

function solution(rgb) {
    // 初始化 R, G, B 三个分量的值
    let r = 0, g = 0, b = 0;
    
    // 移除 "rgb(" 部分
    let i = 4;  // 从第5个字符开始
    let current = 0;  // 当前正在解析的分量
    let value = 0;  // 当前分量的数值
    let state = 0;  // 0: 解析R, 1: 解析G, 2: 解析B

    while (i < rgb.length - 1) {  // 不包括最后一个字符 ")"
        const char = rgb[i];
        
        if (char === ',') {
            if (state === 0) {
                r = value;
            } else if (state === 1) {
                g = value;
            }
            value = 0;
            state++;
            i += 2;  // 跳过逗号和空格
            continue;
        }

        if (char >= '0' && char <= '9') {
            value = value * 10 + (char.charCodeAt(0) - '0'.charCodeAt(0));
        }

        i++;
    }

    // 最后一个分量是 B
    b = value;

    // 将R, G, B三个分量组合成一个16进制颜色值
    const hexColor = (r << 16) | (g << 8) | b;
    
    return hexColor;
}

function main() {

    console.log(solution("rgb(192, 192, 192)") === 12632256);  
    console.log(solution("rgb(100, 0, 252)") === 6553852);    
    console.log(solution("rgb(33, 44, 55)") === 2174007);     
    console.log(solution("rgb(255, 255, 255)") === 16777215);  
    console.log(solution("rgb(0, 0, 0)") === 0);               
}

main();

代码解释:

  1. 初始化:初始化 R、G、B 三个分量的值为 0。
  2. 移除 "rgb(" 部分:从第 5 个字符开始解析。
  3. 手动解析字符串
    • 使用 while 循环遍历字符串,逐个字符解析 R、G、B 三个分量。
    • 如果遇到逗号 ,,则将当前解析的分量值赋给相应的变量(R、G 或 B),并将 value 重置为 0,同时跳过逗号和空格。
    • 如果遇到数字字符,则更新 value 的值。
  4. 最后的分量:循环结束后,将最后一个分量的值赋给 B。
  5. 组合 R、G、B 三个分量:使用位移操作将 R、G、B 三个分量组合成一个 24 位的整数。

好的,以上就是这道题的两种解法

总的来说,第一种更简洁,但是属于使用内置api取捷径,如果换一个语言环境应该就不是那么好实现了。

第二种是通法,在其他语言中也可以像这样解答。