题目地址:
https://www.lintcode.com/problem/1017/
给定一个颜色,其以字符串"#ABCDEF"
的形式表示,其中"AB", "CD", "EF"
代表十六进制数。要求求得一个颜色,形如"#XXYYZZ"
,使得
∣
(
A
B
−
X
X
)
2
+
(
C
D
−
Y
Y
)
2
+
(
E
F
−
Z
Z
)
2
∣
|(AB-XX)^2+(CD-YY)^2+(EF-ZZ)^2|
∣(AB−XX)2+(CD−YY)2+(EF−ZZ)2∣最小。
直接枚举即可,每个"XX"
的情况只有
16
16
16种。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
/**
* @param color: the given color
* @return: a 7 character color that is most similar to the given color
*/
public String similarRGB(String color) {
// Write your code here
List<Character> list = new ArrayList<>();
for (char i = '0'; i <= '9'; i++) {
list.add(i);
}
for (char i = 'a'; i <= 'f'; i++) {
list.add(i);
}
StringBuilder sb = new StringBuilder();
sb.append('#');
for (int i = 1; i < color.length(); i += 2) {
sb.append(getClose(color.substring(i, i + 2), list));
}
return sb.toString();
}
private String getClose(String s, List<Character> list) {
int x = list.indexOf(s.charAt(0)) * 16 + list.indexOf(s.charAt(1));
StringBuilder sb = new StringBuilder();
int dif = Integer.MAX_VALUE;
for (int i = 0; i < 16; i++) {
if (Math.abs(i * 16 + i - x) < dif) {
dif = Math.abs(i * 16 + i - x);
sb.setLength(0);
sb.append(list.get(i)).append(list.get(i));
}
}
return sb.toString();
}
}
时空复杂度 O ( 1 ) O(1) O(1)。