Similar RGB color
這題題意一開始看不懂,意思是給你一個 RGB 顏色,找出最近的顏色,而且是 shorthand 形式
shorthand 是 #XYZ 這樣的
那麼也就是找出 11, 22, 33, ..... AA, BB, ..... FF 組合的顏色
題目又說給的顏色一定是七個字,那我們可以放心的切割字串去做,而且 RGB 互相獨立
對於某一個顏色,我們想要他離 11, 22, ... FF 最近,
那就是看當前顏色是最靠近哪個 11, 22, 33 系列,又這些數字的十進位值是 17,
所以我們可以先看看他是最靠近哪個 17,這樣是處理了一個顏色的十六進位的第一位數部分
接著處理第二位數,當我們決定了是哪個 17,「剩下」的部分是取 17 的餘數
用十進位解釋: 最靠近 29 的 shorthand 是 33,我們先看他最靠近哪個 11 -> 29/11 = 2
「剩下」的部分是 29 % 11 -> 7
29 離 33 是 4, 4 < 7 所以 33 是最近的,其中的判斷部分就是「剩下」的部分
在十進位時,「剩下」的部分如果比較接近 0 那就不用進入下一個 11
「剩下」的部分如果接近 10 就進入下一個 11,判斷關鍵就是 Math.ceiling(11/2) = 6
大於 6 表示離 11 較近
回到題目,我們判斷完多少 17 後,「剩下」的部分如果大於 Math.ceiling(17/2) = 8
就往下一個 17 去
public String similarRGB(String color) {
if (color == null) {
return color;
}
StringBuilder sb = new StringBuilder();
sb.append("#")
.append(getColor(color.substring(1, 3)))
.append(getColor(color.substring(3, 5)))
.append(getColor(color.substring(5, 7)));
return sb.toString();
}
private String getColor(String origin) {
int color = Integer.parseInt(origin, 16);
int num = color/17 + (color%17 > 8 ? 1 : 0);
return String.format("%02x", num * 17);
}
轉換回 string 時不知道為什麼用 Integer.tohexString()
會過不了