题目回顾:
要实现将RGB颜色值转换为相应的十六进制整数值的功能,我们可以按照以下步骤进行:
- 从输入字符串中提取出R、G、B三个分量的值。
- 将每个分量的值转换为16进制,并组合成一个完整的16进制颜色值。
- 将这个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();
-
解析字符串:
- 从输入的字符串中提取出 R、G、B 三个分量的值。
- 字符串的格式是固定的:
"rgb(R, G, B)",其中 R、G、B 是 0 到 255 之间的整数。
-
使用内置方法:
- 使用
slice方法去掉"rgb("和")"部分。 - 使用
split方法将剩下的字符串按逗号和空格分割成一个数组。 - 使用
map方法将数组中的每个字符串转换为整数。
- 使用
-
组合成整数:
- 将 R、G、B 三个分量组合成一个 24 位的整数。
- R 分量左移 16 位,G 分量左移 8 位,B 分量保持不变,然后进行按位或操作。
详细步骤
-
去掉
"rgb("和")"部分:- 使用
slice(4, -1)方法去掉字符串中的"rgb("和")"部分,得到中间的数字部分。例如,"rgb(192, 192, 192)"变成"192, 192, 192"。
- 使用
-
分割得到 R、G、B 三个分量:
- 使用
split(', ')方法将剩下的字符串按逗号和空格分割成一个数组。例如,"192, 192, 192"变成["192", "192", "192"]。 - 使用
map(Number)方法将数组中的每个字符串转换为整数。例如,["192", "192", "192"]变成[192, 192, 192]。
- 使用
-
组合成整数:
-
使用位移操作将 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();
代码解释:
- 初始化:初始化 R、G、B 三个分量的值为 0。
- 移除 "rgb(" 部分:从第 5 个字符开始解析。
- 手动解析字符串:
- 使用
while循环遍历字符串,逐个字符解析 R、G、B 三个分量。 - 如果遇到逗号
,,则将当前解析的分量值赋给相应的变量(R、G 或 B),并将value重置为 0,同时跳过逗号和空格。 - 如果遇到数字字符,则更新
value的值。
- 使用
- 最后的分量:循环结束后,将最后一个分量的值赋给 B。
- 组合 R、G、B 三个分量:使用位移操作将 R、G、B 三个分量组合成一个 24 位的整数。
好的,以上就是这道题的两种解法
总的来说,第一种更简洁,但是属于使用内置api取捷径,如果换一个语言环境应该就不是那么好实现了。
第二种是通法,在其他语言中也可以像这样解答。