|
| 1 | +##[0800. 相似 RGB 颜色](https://leetcode-cn.com/problems/similar-rgb-color/) |
| 2 | + |
| 3 | +- 标签:数学、字符串、枚举 |
| 4 | +- 难度:简单 |
| 5 | + |
| 6 | +##题目大意 |
| 7 | + |
| 8 | +**描述**:RGB 颜色`"#AABBCC"` 可以简写成`"#ABC"` 。例如,`"#1155cc"` 可以简写为`"#15c"`。现在给定一个按`"#ABCDEF"` 形式定义的字符串`color` 表示 RGB 颜色。 |
| 9 | + |
| 10 | +**要求**:返回一个与`color` 相似度最大并且可以简写的颜色。 |
| 11 | + |
| 12 | +**说明**: |
| 13 | + |
| 14 | +- 两个颜色`"#ABCDEF"` 和`"#UVWXYZ"` 的相似度计算公式为:$-(AB - UV)^2 - (CD - WX)^2 - (EF - YZ)^2$。 |
| 15 | + |
| 16 | + |
| 17 | +**示例**: |
| 18 | + |
| 19 | +```Python |
| 20 | +输入 color="#09f166" |
| 21 | +输出"#11ee66" |
| 22 | +解释: 因为相似度计算得出-(0x09-0x11)^2-(0xf1-0xee)^2- (0x66-0x66)^2=-64-9-0=-73,这是所有可以简写的颜色中与 color 最相似的颜色 |
| 23 | +``` |
| 24 | + |
| 25 | +##解题思路 |
| 26 | + |
| 27 | +###思路 1:枚举算法 |
| 28 | + |
| 29 | +所有可以简写的颜色范围是`"#000"` ~`"#fff"`,共 $16^3 = 4096$ 种颜色。因此,我们可以枚举这些可以简写的颜色,并计算出其与`color`的相似度,从而找出与`color` 最相似的颜色。具体做法如下: |
| 30 | + |
| 31 | +- 将`color` 转换为十六进制数,即`hex_color = int(color[1:], 16)`。 |
| 32 | +- 三重循环遍历`R`、`G`、`B` 三个通道颜色,每一重循环范围为`0` ~`15`。 |
| 33 | +- 计算出每一种可以简写的颜色对应的十六进制,即`17 * R * (1 << 16) + 17 * G * (1 << 8) + 17 * B`,`17` 是`0x11 = 16 + 1 = 17`,`(1 << 16)` 为`R` 左移的位数,`17 * R * (1 << 16)` 就表示`R` 通道上对应的十六进制数。`(1 << 8)` 为`G` 左移的位数,`17 * G * (1 << 8)` 就表示`G` 通道上对应的十六进制数。`17 * B` 就表示`B` 通道上对应的十六进制数。 |
| 34 | +- 然后我们根据`color` 的十六进制数,与每一个可以简写的颜色对应的十六进制数,计算出相似度,并找出大相似对应的颜色。将其转换为字符串,并输出。 |
| 35 | + |
| 36 | +###思路 1:枚举算法代码 |
| 37 | + |
| 38 | +```Python |
| 39 | +classSolution: |
| 40 | +defsimilar(self,hex1,hex2): |
| 41 | + r1, g1, b1= hex1>>16, (hex1>>8)%256, hex1%256 |
| 42 | + r2, g2, b2= hex2>>16, (hex2>>8)%256, hex2%256 |
| 43 | +return- (r1- r2)**2- (g1- g2)**2- (b1- b2)**2 |
| 44 | + |
| 45 | +defsimilarRGB(self,color:str) ->str: |
| 46 | + ans=0 |
| 47 | + hex_color=int(color[1:],16) |
| 48 | +for rinrange(16): |
| 49 | +for ginrange(16): |
| 50 | +for binrange(16): |
| 51 | + hex_cur=17* r* (1<<16)+17* g* (1<<8)+17* b |
| 52 | +ifself.similar(hex_color, hex_cur)>self.similar(hex_color, ans): |
| 53 | + ans= hex_cur |
| 54 | + |
| 55 | +return"#{:06x}".format(ans) |
| 56 | +``` |