1017. 相似的RGB颜色
在本题中,每个大写字母代表从“0”到“f”的一些十六进制数字。
红绿蓝三元色#AABBCC可以简写为#ABC。 例如,#15c是颜色#1155cc的简写。
现在,假设两种颜色#ABCDEF和#UVWXYZ之间的相似性是-(AB - UV) ^ 2 - (CD - WX) ^ 2 - (EF - YZ) ^ 2。
给定颜色#ABCDEF,返回与#ABCDEF最相似且含有一个简写的7字符颜色(也就是说,它可以用类似#XYZ的形式表示)。
样例
样例1:
输入: color = "#09f166"
输出: "#11ee66"
解释:
二者相似程度为 -(0x09 - 0x11)^2 -(0xf1 - 0xee)^2 - (0x66 - 0x66)^2 = -64 -9 -0 = -73.
这是所有能够简写的颜色里最接近的颜色。
样例2:
输入: color = "#010000"
输出: "#000000"
解释:
二者相似程度为 -(0x01 - 0x00)^2 -(0x00 - 0x00)^2 - (0x00 - 0x00)^2 = -1 -0 -0 = -1.
这是所有能够简写的颜色里最接近的颜色。
注意事项
-
color 是一个长度为7的字符串。
-
color 是一个合法的RGB颜色: 对于每一个 i > 0, color[i] 是一个 0 到 f的十六进制数字。
-
任何一个有最高相似度的答案都是正确的。
-
所有的输入输出都是小写字母,输出应为7个字符的字符串。
public class Solution {
/**
* @param color: the given color
* @return: a 7 character color that is most similar to the given color
*/
public String similarRGB(String color) {
// Write your code here
String result = "#";
result = result + rgb(color.substring(1, 3))
+ rgb(color.substring(3, 5))
+ rgb(color.substring(5, 7));
return result;
}
private String rgb(String substring) {
if (substring == null) return "";
int sum = Integer.parseInt(substring, 16);
if (sum < 0x11) {
if (sum > 8)
return "11";
else return "00";
} else if (sum < 0x22) {
if (sum > (0x22 - 9))
return "22";
else return "11";
} else if (sum < 0x33) {
if (sum > (0x33 - 9))
return "33";
else return "22";
} else if (sum < 0x44) {
if (sum > (0x44 - 9))
return "44";
else return "33";
} else if (sum < 0x55) {
if (sum > (0x55 - 9))
return "55";
else return "44";
} else if (sum < 0x66) {
if (sum > (0x66 - 9))
return "66";
else return "55";
} else if (sum < 0x77) {
if (sum > (0x77 - 9))
return "77";
else return "66";
} else if (sum < 0x88) {
if (sum > (0x88 - 9))
return "88";
else return "77";
} else if (sum < 0x99) {
if (sum > (0x99 - 9))
return "99";
else return "88";
} else if (sum < 0xaa) {
if (sum > (0xaa - 9))
return "aa";
else return "99";
} else if (sum < 0xbb) {
if (sum > (0xbb - 9))
return "bb";
else return "aa";
} else if (sum < 0xcc) {
if (sum > (0xcc - 9))
return "cc";
else return "bb";
} else if (sum < 0xdd) {
if (sum > (0xdd - 9))
return "dd";
else return "cc";
} else if (sum < 0xee) {
if (sum > (0xee - 9))
return "ee";
else return "dd";
} else {
if (sum > (0xFF - 9))
return "ff";
else return "ee";
}
}
}