这题还是用正则会快一点
function rgb2hex(sRGB) {
if (/^rgb\([1-9]|[1-9]\d|1\d{2}|2[0-5]{2},\s*\[1-9]|[1-9]\d|1\d{2}|2[0-5]{2},\s*[1-9]|[1-9]\d|1\d{2}|2[0-5]{2}\)$/.test(sRGB)) {
return '#' + sRGB.match(/\d{1,3}/g).map( x => parseInt(x).toString(16)).join('');
} else {
return sRGB;
}
}
不通过 您的代码已保存 答案错误:您提交的程序没有通过所有的测试用例 case通过率为75.00%
还有25%,让我想想。
好像是正则写错了`rgb(0,0,0)这种情况没考虑,也不对应该说是转换成16进制不满二位的情况没考虑充分。
function rgb2hex(sRGB) {
if (/^rgb\(\d|[1-9]\d|1\d{2}|2[0-5]{2},\s*\\d|[1-9]\d|1\d{2}|2[0-5]{2},\s*\d|[1-9]\d|1\d{2}|2[0-5]{2}\)$/.test(sRGB)) {
return '#' + sRGB.match(/\d{1,3}/g).map(function (x) {
if(parseInt(x) < 16) {
return '0' + parseInt(x).toString(16);
}else {
return parseInt(x).toString(16);
}
}).join('');
} else {
return sRGB;
}
}
运行时间:1620ms,占用内存:85004k
这个是我的一些测试用例
console.log(rgb2hex('rgb(255, 255, 255)'));
console.log(rgb2hex('rgb(0, 0, 0)'));
console.log(rgb2hex('rgb(0, 22, 123)'));
console.log(rgb2hex('rgb(0, 123, 0)'));
console.log(rgb2hex('rgb(15, 199, 255)'));
console.log(rgb2hex('rgb(15, 199, 15)'));
console.log(rgb2hex('rgb(15, 199, 14)'));
console.log(rgb2hex('rgb(22, 124, 234)'));
我还有种更猥琐的解法,看了下也不过就255个,我通通把你列出来。
function rgb2hex(sRGB) {
let rgbObj = {
0: "00",
1: "01",
2: "02",
3: "03",
4: "04",
5: "05",
6: "06",
7: "07",
8: "08",
9: "09",
10: "0a",
11: "0b",
12: "0c",
13: "0d",
14: "0e",
15: "0f",
16: "10",
17: "11",
18: "12",
19: "13",
20: "14",
21: "15",
22: "16",
23: "17",
24: "18",
25: "19",
26: "1a",
27: "1b",
28: "1c",
29: "1d",
30: "1e",
31: "1f",
32: "20",
33: "21",
34: "22",
35: "23",
36: "24",
37: "25",
38: "26",
39: "27",
40: "28",
41: "29",
42: "2a",
43: "2b",
44: "2c",
45: "2d",
46: "2e",
47: "2f",
48: "30",
49: "31",
50: "32",
51: "33",
52: "34",
53: "35",
54: "36",
55: "37",
56: "38",
57: "39",
58: "3a",
59: "3b",
60: "3c",
61: "3d",
62: "3e",
63: "3f",
64: "40",
65: "41",
66: "42",
67: "43",
68: "44",
69: "45",
70: "46",
71: "47",
72: "48",
73: "49",
74: "4a",
75: "4b",
76: "4c",
77: "4d",
78: "4e",
79: "4f",
80: "50",
81: "51",
82: "52",
83: "53",
84: "54",
85: "55",
86: "56",
87: "57",
88: "58",
89: "59",
90: "5a",
91: "5b",
92: "5c",
93: "5d",
94: "5e",
95: "5f",
96: "60",
97: "61",
98: "62",
99: "63",
100: "64",
101: "65",
102: "66",
103: "67",
104: "68",
105: "69",
106: "6a",
107: "6b",
108: "6c",
109: "6d",
110: "6e",
111: "6f",
112: "70",
113: "71",
114: "72",
115: "73",
116: "74",
117: "75",
118: "76",
119: "77",
120: "78",
121: "79",
122: "7a",
123: "7b",
124: "7c",
125: "7d",
126: "7e",
127: "7f",
128: "80",
129: "81",
130: "82",
131: "83",
132: "84",
133: "85",
134: "86",
135: "87",
136: "88",
137: "89",
138: "8a",
139: "8b",
140: "8c",
141: "8d",
142: "8e",
143: "8f",
144: "90",
145: "91",
146: "92",
147: "93",
148: "94",
149: "95",
150: "96",
151: "97",
152: "98",
153: "99",
154: "9a",
155: "9b",
156: "9c",
157: "9d",
158: "9e",
159: "9f",
160: "a0",
161: "a1",
162: "a2",
163: "a3",
164: "a4",
165: "a5",
166: "a6",
167: "a7",
168: "a8",
169: "a9",
170: "aa",
171: "ab",
172: "ac",
173: "ad",
174: "ae",
175: "af",
176: "b0",
177: "b1",
178: "b2",
179: "b3",
180: "b4",
181: "b5",
182: "b6",
183: "b7",
184: "b8",
185: "b9",
186: "ba",
187: "bb",
188: "bc",
189: "bd",
190: "be",
191: "bf",
192: "c0",
193: "c1",
194: "c2",
195: "c3",
196: "c4",
197: "c5",
198: "c6",
199: "c7",
200: "c8",
201: "c9",
202: "ca",
203: "cb",
204: "cc",
205: "cd",
206: "ce",
207: "cf",
208: "d0",
209: "d1",
210: "d2",
211: "d3",
212: "d4",
213: "d5",
214: "d6",
215: "d7",
216: "d8",
217: "d9",
218: "da",
219: "db",
220: "dc",
221: "dd",
222: "de",
223: "df",
224: "e0",
225: "e1",
226: "e2",
227: "e3",
228: "e4",
229: "e5",
230: "e6",
231: "e7",
232: "e8",
233: "e9",
234: "ea",
235: "eb",
236: "ec",
237: "ed",
238: "ee",
239: "ef",
240: "f0",
241: "f1",
242: "f2",
243: "f3",
244: "f4",
245: "f5",
246: "f6",
247: "f7",
248: "f8",
249: "f9",
250: "fa",
251: "fb",
252: "fc",
253: "fd",
254: "fe",
255: "ff",
};
if (/^rgb\(\d|[1-9]\d|1\d{2}|2[0-5]{2},\s*\\d|[1-9]\d|1\d{2}|2[0-5]{2},\s*\d|[1-9]\d|1\d{2}|2[0-5]{2}\)$/.test(sRGB)) {
return '#' + sRGB.match(/\d{1,3}/g).map(function (x) {
return rgbObj[x];
}).join('');
} else {
return sRGB;
}
}
运行时间:1433ms,占用内存:77880k
嬉皮士
function rgb2hex(sRGB) {
return sRGB.replace(/^rgb\((\d+)\s*\,\s*(\d+)\s*\,\s*(\d+)\)$/g, function(a, r, g, b){
return '#' + hex(r) + hex(g) + hex(b);
});
}
function hex(n){
return n < 16 ? '0' + (+n).toString(16) : (+n).toString(16);
}
陌上 : 请问这里为什么是四个参数(a,r,g,b),分别代表什么?
嬉皮士 回复 陌上 : 通常是用的 a代表正则匹配的整个字符串, r ,g, b代表红绿蓝三个通道, 分别是正则中的三个括号匹配的字符串. 通常用的$0, $1, $2, $3, 个人习惯喜欢起好记的别名
wo们小时候
function rgb2hex(sRGB) {
var regexp=/rgb\((\d+),\s*(\d+),\s*(\d+)\)/;
var ret=sRGB.match(regexp);
if(!ret){
return sRGB;
}else{
var str='#';
for(var i=1;i<=3;i++){
var m=parseInt(ret[i]);
if(m<=255&&m>=0){
str+=(m<16?'0'+m.toString(16):m.toString(16));
}else{
return sRGB;
}
}
return str;
}
}
soulor.魂
//方式1:行数最少
function rgb2hex(sRGB) {
return sRGB.replace(/^rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)$/,function($0,$1,$2,$3){
return '#'+('0'+(+$1).toString(16)).slice(-2)+('0'+(+$2).toString(16)).slice(-2)+('0'+(+$3).toString(16)).slice(-2);
});
}
//方式2:行数较少,代码较少,容易理解
function rgb2hex(sRGB) {
return sRGB.replace(/^rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)$/,function($0,$1,$2,$3){
return '#'+toHex($1)+toHex($2)+toHex($3);
});
}
function toHex(str){
return ('0'+(+str).toString(16)).slice(-2);
}
//方式3:行数较少,代码最少,容易理解? //
function rgb2hex(sRGB){
var result=['#'];
if(!/rgb\(\d+(,\s*\d+){2}\)/.test(sRGB)){
return sRGB;
}
sRGB.replace(/\d+/g,function($0){
result.push(('0'+(+$0).toString(16)).slice(-2));
});
return result.join('');
}
codpoe
分享一个用移位来算 rgb 的方法。
function rgb2hex(sRGB) {
return sRGB.replace(/^rgb\((\d+)\s*\,\s*(\d+)\s*\,\s*(\d+)\)$/g, function(str, r, g, b){
return '#' +
('00000' + (r << 16 | g << 8 | b).toString(16)).slice(-6);
});
}