给定一组数字,以产生最大值的方式排列它们。 例 {} 54,546,548,60 该安排是6054854654给出的最大值。
self
输出为60 548 546 54。 我需要了解IComparer如何对此数组进行排序
提前致谢
答案 0 :(得分:0)
代码的要点是尝试通过连接整数列表来找到最大可能的数字。如果你把这个逻辑分解为只有两个数字,比如前两个([65,546]
)比较器将它们连接起来以确定哪个数字会更大,它会问:
" 65546是大于还是小于54665"。
然后它继续对数组中所有其他数字组合执行此操作,以便在连接在一起时使它们排序成为最大数字。
答案 1 :(得分:0)
我写了some code that might help you understand,
基本上,比较器可帮助您按最高有效数字进行排序,您可以使用我在df = pd.DataFrame({'student':['a'] * 4 + ['b'] * 6,
'semester':[1,1,2,2,1,1,2,2,2,2],
'passed_exam':[True, False] * 5})
print (df)
passed_exam semester student
0 True 1 a
1 False 1 a
2 True 2 a
3 False 2 a
4 True 1 b
5 False 1 b
6 True 2 b
7 False 2 b
8 True 2 b
9 False 2 b
table = df.groupby(["student","semester","passed_exam"])
.size()
.unstack(fill_value=0)
.rename_axis(None, axis=1)
.reset_index()
print (table)
student semester False True
0 a 1 1 1
1 a 2 1 1
2 b 1 1 1
3 b 2 2 2
中提供的实现来避免字符串操作。我怀疑使用一些二进制数学可能有更有效的方法来做到这一点。
PowComp
代码输出这些结果。
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
var concatComp = new ConcatComp();
var modComp = new ModComp();
var powComp = new PowComp();
var tests = new[]
{
Tuple.Create(0, 0),
Tuple.Create(1, 9),
Tuple.Create(9, 1),
Tuple.Create(1, 999),
Tuple.Create(999, 1),
Tuple.Create(111, 9),
Tuple.Create(9, 111),
Tuple.Create(91, 19),
Tuple.Create(19, 91)
};
foreach(var pair in tests)
{
var concatR = R(concatComp.Compare(pair.Item1, pair.Item2));
var modR = R(modComp.Compare(pair.Item1, pair.Item2));
var powR = R(powComp.Compare(pair.Item1, pair.Item2));
Console.WriteLine(
$"x:{pair.Item1}, y:{pair.Item2}, concatR:{concatR}, modR:{modR}, powR:{powR}");
}
}
public static string R(int v)
{
if (v == 0)
return "=";
if (v < 0)
return "y";
return "x";
}
}
public class ConcatComp : IComparer<int>
{
public int Compare(int x, int y)
{
var xy = int.Parse(x.ToString() + y.ToString());
var yx = int.Parse(y.ToString() + x.ToString());
return xy - yx;
}
}
public class ModComp : IComparer<int>
{
public int Compare(int x, int y)
{
return (x % 10) - (y % 10);
}
}
public class PowComp : IComparer<int>
{
public int Compare(int x, int y)
{
return MSD(x) - MSD(y);
}
public int MSD(int v)
{
if (v < 10)
return v;
return v / (int)Math.Pow(10.0, (int)Math.Log10(v));
}
}