列表

详情


800. 相似 RGB 颜色

RGB 颜色 "#AABBCC" 可以简写成 "#ABC"

现在,假如我们分别定义两个颜色 "#ABCDEF" 和 "#UVWXYZ",则他们的相似度可以通过这个表达式 -(AB - UV)^2 - (CD - WX)^2 - (EF - YZ)^2 来计算。

那么给你一个按 "#ABCDEF" 形式定义的字符串 color 表示 RGB 颜色,请你以字符串形式,返回一个与它相似度最大且可以简写的颜色。(比如,可以表示成类似 "#XYZ" 的形式)

任何 具有相同的(最大)相似度的答案都会被视为正确答案。

 

示例 1:

输入:color = "#09f166"
输出:"#11ee66"
解释: 
因为相似度计算得出 -(0x09 - 0x11)^2 -(0xf1 - 0xee)^2 - (0x66 - 0x66)^2 = -64 -9 -0 = -73
这已经是所有可以简写的颜色中最相似的了

示例 2:

输入:color = "#4e3fe1"
输出:"#5544dd"

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: string similarRGB(string color) { } };

golang 解法, 执行用时: 0 ms, 内存消耗: 1.8 MB, 提交时间: 2023-10-15 18:55:45

func similarRGB(color string) string {
    return "#"+getSimilarNum(color[1:3])+getSimilarNum(color[3:5])+getSimilarNum(color[5:7])
}

func getSimilarNum(color string)string{
    if color[0] == color[1]{
        return color
    }
    de := math.MaxFloat64
    res := ""
    i,_ := strconv.ParseInt(color,16,64)
    strs := []string{"00","11","22","33","44","55","66","77","88","99","aa","bb","cc","dd","ee","ff"}
    for _,str := range strs{
        s,_:= strconv.ParseInt(str,16,64)
        k := math.Abs(float64(s-i))
        if k <= de{
            de = k
            res = str
        }
    }
    return res
}


func similarRGB2(color string) string {
	return fmt.Sprintf("#%s%s%s", format(color[1:3]), format(color[3:5]), format(color[5:]))
}

func format(comp string) string {
	var first, second uint8
	if comp[0] >= 'a' {
		first = comp[0] - 'a' + 10
	} else {
		first = comp[0] - '0'
	}
	if comp[1] >= 'a' {
		second = comp[1] - 'a' + 10
	} else {
		second = comp[1] - '0'
	}
	value := first*16 + second
	q := value / 17
	if value%17 > 8 {
		q += 1
	}
	return fmt.Sprintf("%02x", 17*q)
}

cpp 解法, 执行用时: 4 ms, 内存消耗: 6.2 MB, 提交时间: 2023-10-15 18:54:50

class Solution {
public:
    string similarRGB(string color) {
        string res = "#";
        for (int i = 1; i < 7; i += 2) {  //两个两个地处理
            int cur = real_num(color[i]) * 16 + real_num(color[i+1]);
            ///////////因为最后都是 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 转换成10进制后都是17的倍数
            int a = cur / 17;
            int b = cur % 17;
            if (b > 8)          ////看是否过半了
                a ++;

            int num = a * 17;
            int x = num / 16;
            int y = num % 16;
            
            res += (x<10 ? '0'+x : 'a'+(x-10));
            res += (y<10 ? '0'+y : 'a'+(y-10));
        }
        return res;
    }

    /////////////换算成10进制的数
    int real_num(char c) {
        if (isdigit(c) != 0)
            return c - '0';
        return c - 'a' + 10;
    }
};

java 解法, 执行用时: 13 ms, 内存消耗: 40.8 MB, 提交时间: 2023-10-15 18:54:06

class Solution {
    public String similarRGB(String color) {
        return "#" + f(color.substring(1, 3)) + f(color.substring(3, 5)) + f(color.substring(5));
    }

    public String f(String comp) {
        int q = Integer.parseInt(comp, 16);
        q = q / 17 + (q % 17 > 8 ? 1 : 0);
        return String.format("%02x", 17 * q);
    }
}

python3 解法, 执行用时: 48 ms, 内存消耗: 16.1 MB, 提交时间: 2023-10-15 18:53:47

class Solution:
    # 枚举
    def similarRGB1(self, color):
        def similarity(hex1, hex2):
            r1, g1, b1 = hex1 >> 16, (hex1 >> 8) % 256, hex1 % 256
            r2, g2, b2 = hex2 >> 16, (hex2 >> 8) % 256, hex2 % 256
            return -(r1 - r2)**2 - (g1 - g2)**2 - (b1 - b2)**2

        hex1 = int(color[1:], 16)
        ans = 0
        for r in range(16):
            for g in range(16):
                for b in range(16):
                    hex2 = 17 * r * (1 << 16) + 17 * g * (1 << 8) + 17 * b
                    if similarity(hex1, hex2) > similarity(hex1, ans):
                        ans = hex2

        return '#{:06x}'.format(ans)
        
    # 独立性 + 枚举
    def similarRGB(self, color):
        def f(comp):
            q, r = divmod(int(comp, 16), 17)
            if r > 8: q += 1
            return '{:02x}'.format(17 * q)

        return '#' + f(color[1:3]) + f(color[3:5]) + f(color[5:])

java 解法, 执行用时: 27 ms, 内存消耗: 40.1 MB, 提交时间: 2023-10-15 18:52:43

class Solution {
    public String similarRGB(String color) {
        int hex1 = Integer.parseInt(color.substring(1), 16);
        int ans = 0;
        for (int r = 0; r < 16; ++r)
            for (int g = 0; g < 16; ++g)
                for (int b = 0; b < 16; ++b) {
                    int hex2 = 17 * r * (1 << 16) + 17 * g * (1 << 8) + 17 * b;
                    if (similarity(hex1, hex2) > similarity(hex1, ans))
                        ans = hex2;
                }

        return String.format("#%06x", ans);
    }

    public int similarity(int hex1, int hex2) {
        int ans = 0;
        for (int shift = 16; shift >= 0; shift -= 8) {
            int col1 = (hex1 >> shift) % 256;
            int col2 = (hex2 >> shift) % 256;
            ans -= (col1 - col2) * (col1 - col2);
        }
        return ans;
    }
}

上一题