class Solution {
public:
string similarRGB(string color) {
}
};
800. 相似 RGB 颜色
RGB 颜色 "#AABBCC"
可以简写成 "#ABC"
。
"#15c"
其实是 "#1155cc"
的简写。现在,假如我们分别定义两个颜色 "#ABCDEF"
和 "#UVWXYZ"
,则他们的相似度可以通过这个表达式 -(AB - UV)^2 - (CD - WX)^2 - (EF - YZ)^2
来计算。
那么给你一个按 "#ABCDEF"
形式定义的字符串 color
表示 RGB 颜色,请你以字符串形式,返回一个与它相似度最大且可以简写的颜色。(比如,可以表示成类似 "#XYZ"
的形式)
任何 具有相同的(最大)相似度的答案都会被视为正确答案。
示例 1:
输入:color = "#09f166" 输出:"#11ee66" 解释: 因为相似度计算得出 -(0x09 - 0x11)^2 -(0xf1 - 0xee)^2 - (0x66 - 0x66)^2 = -64 -9 -0 = -73 这已经是所有可以简写的颜色中最相似的了
示例 2:
输入:color = "#4e3fe1" 输出:"#5544dd"
提示:
color.length == 7
color[0] == '#'
i > 0
,color[i]
都是一个在范围 ['0', 'f']
内的 16 进制数原站题解
golang 解法, 执行用时: 0 ms, 内存消耗: 1.8 MB, 提交时间: 2023-10-15 18:55:45
func similarRGB(color string) string { return "#"+getSimilarNum(color[1:3])+getSimilarNum(color[3:5])+getSimilarNum(color[5:7]) } func getSimilarNum(color string)string{ if color[0] == color[1]{ return color } de := math.MaxFloat64 res := "" i,_ := strconv.ParseInt(color,16,64) strs := []string{"00","11","22","33","44","55","66","77","88","99","aa","bb","cc","dd","ee","ff"} for _,str := range strs{ s,_:= strconv.ParseInt(str,16,64) k := math.Abs(float64(s-i)) if k <= de{ de = k res = str } } return res } func similarRGB2(color string) string { return fmt.Sprintf("#%s%s%s", format(color[1:3]), format(color[3:5]), format(color[5:])) } func format(comp string) string { var first, second uint8 if comp[0] >= 'a' { first = comp[0] - 'a' + 10 } else { first = comp[0] - '0' } if comp[1] >= 'a' { second = comp[1] - 'a' + 10 } else { second = comp[1] - '0' } value := first*16 + second q := value / 17 if value%17 > 8 { q += 1 } return fmt.Sprintf("%02x", 17*q) }
cpp 解法, 执行用时: 4 ms, 内存消耗: 6.2 MB, 提交时间: 2023-10-15 18:54:50
class Solution { public: string similarRGB(string color) { string res = "#"; for (int i = 1; i < 7; i += 2) { //两个两个地处理 int cur = real_num(color[i]) * 16 + real_num(color[i+1]); ///////////因为最后都是 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 转换成10进制后都是17的倍数 int a = cur / 17; int b = cur % 17; if (b > 8) ////看是否过半了 a ++; int num = a * 17; int x = num / 16; int y = num % 16; res += (x<10 ? '0'+x : 'a'+(x-10)); res += (y<10 ? '0'+y : 'a'+(y-10)); } return res; } /////////////换算成10进制的数 int real_num(char c) { if (isdigit(c) != 0) return c - '0'; return c - 'a' + 10; } };
java 解法, 执行用时: 13 ms, 内存消耗: 40.8 MB, 提交时间: 2023-10-15 18:54:06
class Solution { public String similarRGB(String color) { return "#" + f(color.substring(1, 3)) + f(color.substring(3, 5)) + f(color.substring(5)); } public String f(String comp) { int q = Integer.parseInt(comp, 16); q = q / 17 + (q % 17 > 8 ? 1 : 0); return String.format("%02x", 17 * q); } }
python3 解法, 执行用时: 48 ms, 内存消耗: 16.1 MB, 提交时间: 2023-10-15 18:53:47
class Solution: # 枚举 def similarRGB1(self, color): def similarity(hex1, hex2): r1, g1, b1 = hex1 >> 16, (hex1 >> 8) % 256, hex1 % 256 r2, g2, b2 = hex2 >> 16, (hex2 >> 8) % 256, hex2 % 256 return -(r1 - r2)**2 - (g1 - g2)**2 - (b1 - b2)**2 hex1 = int(color[1:], 16) ans = 0 for r in range(16): for g in range(16): for b in range(16): hex2 = 17 * r * (1 << 16) + 17 * g * (1 << 8) + 17 * b if similarity(hex1, hex2) > similarity(hex1, ans): ans = hex2 return '#{:06x}'.format(ans) # 独立性 + 枚举 def similarRGB(self, color): def f(comp): q, r = divmod(int(comp, 16), 17) if r > 8: q += 1 return '{:02x}'.format(17 * q) return '#' + f(color[1:3]) + f(color[3:5]) + f(color[5:])
java 解法, 执行用时: 27 ms, 内存消耗: 40.1 MB, 提交时间: 2023-10-15 18:52:43
class Solution { public String similarRGB(String color) { int hex1 = Integer.parseInt(color.substring(1), 16); int ans = 0; for (int r = 0; r < 16; ++r) for (int g = 0; g < 16; ++g) for (int b = 0; b < 16; ++b) { int hex2 = 17 * r * (1 << 16) + 17 * g * (1 << 8) + 17 * b; if (similarity(hex1, hex2) > similarity(hex1, ans)) ans = hex2; } return String.format("#%06x", ans); } public int similarity(int hex1, int hex2) { int ans = 0; for (int shift = 16; shift >= 0; shift -= 8) { int col1 = (hex1 >> shift) % 256; int col2 = (hex2 >> shift) % 256; ans -= (col1 - col2) * (col1 - col2); } return ans; } }