輸入字符串,按每個字符與 'U' 的差值絕對值升序排序。例如 "ABC" → 'A'-'U'=14, 'B'-'U'=13, 'C'-'U'=12 → 絕對值 14,13,12 → 升序輸出 C, B, A。
所有字符減去同一常數 'U',再取絕對值,相對大小關係不變!
< 'U'(如大寫字母 A-Z),差值為負,絕對值 = 'U' - 字符,**字符越大,差值越小** → 升序 = 字符降序。> 'U',差值為正,絕對值 = 字符 - 'U',**字符越大,差值越大** → 升序 = 字符升序。'U',需分段討論,但**直接按字符編碼排序後,再按與 'U' 距離調整**更複雜。import java.util.Arrays;
public class SortByU {
public static void main(String[] args) {
String input = "ABCDEF";
char[] chars = input.toCharArray();
Arrays.sort(chars); // 直接按 Unicode 升序
System.out.println(new String(chars)); // ABCDEF
}
}
(a,b) -> Math.abs(a-'U') - Math.abs(b-'U')。// 按與 'U' 的距離升序(跨越 'U' 時必須用)
Arrays.sort(chars, (a, b) -> {
int diffA = Math.abs(a - 'U');
int diffB = Math.abs(b - 'U');
return Integer.compare(diffA, diffB);
});
**同一常數偏移 + 單調變換(絕對值在單側單調)不改變排序順序**。見到此類題目,先分析數學本質,再決定是否需要寫比較器。這是演算法優化與面試解題的核心思維。