leetcode
leetcode 701 ~ 750
相似 RGB 颜色

相似 RGB 颜色

难度:

标签:

题目描述

代码结果

运行时间: 32 ms, 内存: 16.0 MB


/*
 * 思路:
 * 使用Java Stream API来实现相似RGB颜色的求解。
 * 将原始颜色的每个部分分别处理,找到最接近的16进制值,并使用Stream API简化处理流程。
 */
import java.util.Arrays;
 
public class SimilarRGBColorStream {
    private static final String[] hexDigits = {"00", "11", "22", "33", "44", "55", "66", "77", "88", "99", "aa", "bb", "cc", "dd", "ee", "ff"};
 
    public String similarRGB(String color) {
        return "#" + Arrays.stream(new String[]{color.substring(1, 3), color.substring(3, 5), color.substring(5, 7)})
                            .map(this::getClosest)
                            .reduce("", String::concat);
    }
 
    private String getClosest(String component) {
        int val = Integer.parseInt(component, 16);
        return Arrays.stream(hexDigits)
                     .min((a, b) -> Integer.compare(Math.abs(val - Integer.parseInt(a, 16)), Math.abs(val - Integer.parseInt(b, 16))))
                     .orElse("00");
    }
 
    public static void main(String[] args) {
        SimilarRGBColorStream solution = new SimilarRGBColorStream();
        System.out.println(solution.similarRGB("#09f166")); // 输出: #11ee66
    }
}
 

解释

方法:

这个题解的思路是将 RGB 颜色转换为整数表示,然后对每个分量 R、G、B 分别进行处理。对于每个分量,找到与其最接近的 17 的倍数(即 0x11、0x22、...、0xff),最后将找到的三个分量值重新组合成一个新的 RGB 颜色。具体做法是先将 16 进制字符转换为对应的整数值,然后遍历 0 到 15,找到差值最小的数字,将其转换为 16 进制字符作为结果。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在处理RGB颜色时选择将每个分量找到最接近的17的倍数,而不是其他数值如16或者20?
在处理RGB颜色时选择17的倍数是因为Web颜色中常用的简化表示法。通常,每个颜色分量(R、G、B)是两位十六进制数,范围从00到FF。简化的颜色格式则将每个分量表示为相同的两个十六进制字符(如#11、#22、... #FF),这些值分别是0, 17, 34, ..., 255的十六进制表示(17的倍数)。选择17而非16或20是因为255最接近256(16的方),且可以被17整除15次,完美覆盖从0到255的范围。
🦆
在找到每个分量最接近17的倍数的过程中,为什么需要遍历0到15,这个范围是如何确定的?
因为每个颜色分量(0到255)在简化的十六进制表示中只能取#00, #11, #22, ..., #FF中的一个,这些值对应的是0*17, 1*17, 2*17, ..., 15*17。所以,在0到15的范围内遍历可以覆盖所有可能的17的倍数,确保找到与原始颜色分量最接近的简化值。
🦆
对于字符到整数的映射,题解中使用了一个映射表`mp`,这种方法是否最优,还有没有其他更简便或高效的方法?
题解中使用的映射表方法是直观且易于理解的一种方式。一个更简便的方法是使用Python标准库函数`int`直接将十六进制的字符串转换为整数,例如`int('1a', 16)`将返回整数值26。这种方法可以减少代码量并可能提高一些效率。
🦆
返回结果时,为什么选择将数字转换回两个相同的16进制字符,这样的表示有什么特别的意义或优势吗?
这种返回格式遵循了Web颜色的简化表示法。在简化的十六进制颜色代码中,每个颜色分量用两个相同的十六进制数字表示(如#11、#22等),这种方法简化了颜色的指定,使得记忆和应用更为方便,尤其是在需要快速设定或调整颜色时。此外,这种格式在视觉上更为均匀和一致。

相关问题