【LeetCode(Java) - 800】相似 RGB 颜色

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;
    }
}
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页