lintcode1017-Similar RGB Color

题目描述:

本题中对于一个给定的RGB字符串,找到一个形如“#AABBCC”的字符串使得similarity最大。

通过观察可以发现,两两一组,可以分别找差值最小的,因为都是负的,所以肯定最后结果是最大的。

当分离出两两一组时,当两个字母相同时,最相近的就是本身,直接放进结果中即可,如果两个字母不相同,无非就是三种情况:重复第一个字母两次, 第一个字母减一重复两次, 第一个字母加一重复两次。如果第一个字母是‘0’,‘f’,则只有两种情况。

几种情况通通计算一次,找到差值最小的。

不用考虑第二位字母,因为第二位是在低位上,如果重复两次,差距会变得非常大。肯定不会是最优解。

代码:

char getSimilar(string c){
        if(c[0] == c[1])
            return c[0];
        char res_c = c[0];
        int min_diff = abs(stoi(c, NULL, 16) - stoi(string(2,res_c),NULL, 16));
        char tmp_c;
        if(c[0] > '0'){        //如果是以'0'开头,就不用考虑减一的情况
            tmp_c = c[0]=='a'? '9': c[0]-1;
            int tmp_diff = abs(stoi(c, NULL, 16) - stoi(string(2,tmp_c), NULL, 16));
            if(min_diff > tmp_diff){
                res_c = tmp_c;
                min_diff = tmp_diff;
            }
        }
        if(c[0] < 'f'){      //以'f'开头的就不用考虑加一的情况
            tmp_c = c[0]=='9'? 'a': c[0]+1;
            int tmp_diff = abs(stoi(c, NULL, 16) - stoi(string(2,tmp_c), NULL, 16));
            if(min_diff > tmp_diff){
                res_c = tmp_c;
                min_diff = tmp_diff;
            }
        }
    
        return res_c;
    }
    string similarRGB(string &color) {
        // Write your code here
        if(color.empty())
            return "";
    
        string res = "#";
        for(int i=0; i<3; ++i){
            char res_c = getSimilar(color.substr(2*i+1, 2));
            res += string(2,res_c);
        }
    
        return res;
    }
参考博客:https://blog.csdn.net/magicbean2/article/details/79825431
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值