首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 字符串排序:每個字符與 'U' 差值絕對值升序?其實直接排序即可

     編輯:程式設計綜合問答

題目

輸入字符串,按每個字符與 '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);
});

總結

**同一常數偏移 + 單調變換(絕對值在單側單調)不改變排序順序**。見到此類題目,先分析數學本質,再決定是否需要寫比較器。這是演算法優化與面試解題的核心思維。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved