【LeetCode - 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;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值