题目描述:
本题中对于一个给定的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