C♯の勉強

C♯4.0 で TopCoder の過去問を解きます。

TopCoder SRM 583: SwappingDigits

総当りするだけ。

  • クエリ式の let を使ってみた
  • 入力文字は数字だけなので、StringComparer.Ordinalで文字列比較する必要はない。しかし基本的に文字列ソートはこれを使う癖をつけたほうが良さそうなので一応付けてる。
public class SwappingDigits {
    static public void Swap<T>(ref T a, ref T b) { T t = a; a = b; b = t; }

    public string SwapString(string s, int a, int b) {
        var array = s.ToCharArray();
        Swap(ref array[a], ref array[b]);
        return new string(array);
    }

    public string minNumber(string num) {
        int n = num.Length;
        var q = from i in Enumerable.Range(0, n)
                from j in Enumerable.Range(0, n)
                where i <= j
                let s = SwapString(num, i, j)
                where s[0] != '0'
                select s;
        return q.OrderBy(s => s, StringComparer.Ordinal).First();
    }
}