Brute Force
class Solution:
def similarRGB(self, color: str) -> str:
res = ['#']
n = len(color)
for i in range(1,n,2):
cc = color[i:i+2]
if cc[0] == cc[1]:
res.append(cc)
elif cc[0] > cc[1]:
higher = cc[0]*2
lower = hex(int(cc[0],16)- int('1',16))[2]*2
higher_diff = int(higher,16)-int(cc,16)
lower_diff = int(cc,16) - int(lower,16)
close = lower if lower_diff <= higher_diff else higher
res.append(close)
else:
higher = hex(int(cc[0],16)+int('1',16))
higher = higher[2]*2
lower = cc[0]*2
higher_diff = int(higher,16)-int(cc,16)
lower_diff = int(cc,16) - int(lower,16)
close = lower if lower_diff <= higher_diff else higher
res.append(close)
return ''.join(res)
or use lambda function to find the best candicate closest to each character pair
class Solution:
def similarRGB(self, color: str) -> str:
n = len(color)
def find(s):
return min(['00', '11', '22', '33', '44', '55', '66', '77', '88', '99', 'aa', 'bb', 'cc', 'dd', 'ee', 'ff'],
key = lambda x : abs(int(s,16)-int(x,16))
)
res = [find(color[i:i+2]) for i in range(1,n,2)]
return '#'+''.join(res)
Knowledge point: to add/ substract two hex number, use hex(int(‘a’,16)-+ int(‘e’,16)), hex(‘a’) == 0xa