1、题目描述
2、解题思路
首先,能简写的颜色说明是两个一样字符组成的十六进制数字,比如:00、aa、dd等。
通过相似度的计算表达式可知,RGB三种颜色的独立的,因此可以对三种颜色单独计算,然后拼接即可。
先分析16进制的 0x00、0x11、0x22、…、0xff 的规律,发现每一个元素都是上一个加了一个 0x11,也就是十进制的 17。
也就是说,可以简写的颜色数值其实都是十进制数 17 的倍数。
为了编程方便,一律把十六进制转成十进制再计算。
假设颜色为 0xbc,转成十进制为 188,把它除以 17,结果为 11 余 1。
学过除法的我们知道,被除数为 17,那么余数只能是 1-16。
1-16 的中间值为 8 ,也就是说,如果余数小于 8 ,那么除数距离上一个数近一点,如果余数大于 8 ,那么除数距离下一个数近一点。
0xbc 除以 17 后,余数为 1,也就是说,如果把 0xbc 减去 1,就刚好是 17 的倍数,即 0xbb,可以化简。
0xa6 除以 17 后,余数为 13,也就是说,如果把 0xa6 加上 4,就刚好是 17 的倍数,即 0xaa,可以化简。
有了上面的结论,我们对 RGB 分别进行单独计算,把结果进行拼接。
3、解题代码
class Solution {
public String similarRGB(String color) {
// color = "#XXYYZZ"
return "#" +
f(color.substring(1, 3)) + // XX
f(color.substring(3, 5)) + // YY
f(color.substring(5)); // ZZ
}
public String f(String comp) {
int decComp = Integer.parseInt(comp, 16); // 16 进制转 10 进制
int integral = decComp / 17; // 整数值
int remainder = decComp % 17; // 余数值
int multiple;
if (remainder > 8) {
multiple = integral + 1;
} else {
multiple = integral;
}
int decResult = multiple * 17; // 前面除以 17,现在乘回来
String hexResult = String.format("%02x", decResult); // 转成16进制字符串
return hexResult;
}
}