例子:
a =“ 56 65 74 100 99 68 86 180 90”,按数字排序,权重变为:“ 100 180 90 56 65 74 68 86 99”
当两个数字具有相同的“权重”时,让我们对它们进行分类,就好像它们是字符串而不是数字一样:100位于180之前,因为其“权重”(1)小于180(9)之一,而180则位于90之前因为具有相同的“权重”(9),所以它作为字符串出现在前面。
列表中的所有数字均为正数,列表可以为空。
我的测试:
[TestMethod]
public void Test1()
{
Assert.AreEqual("2000 103 123 4444 99",
WeightSort.orderWeight("103 123 4444 99 2000"));
}
[TestMethod]
public void Test2()
{
Assert.AreEqual("11 11 2000 10003 22 123 1234000 44444444 9999",
WeightSort.orderWeight("2000 10003 1234000 44444444 9999 11 11 22 123"));
}
我的课计算权重的顺序:
public class WeightSort
{
public static string orderWeight(string strng)
{
List<int> list = strng.Split(' ').Select(Int32.Parse).OrderBy(i => i).ToList();
List<int> SumofNums = new List<int>();
List<string> SumandNums = new List<string>();
List<string> SumandNums2 = new List<string>();
List<string> Nums = new List<string>();
foreach (var itm in list)
{
int num = (int)GetSumOfDigits(itm);
SumofNums.Add(num);
SumandNums.Add(itm + "," + num);
}
SumofNums = SumofNums.OrderBy(i => i).ToList();
string txt = "";
foreach (var itm in SumofNums)
{
var item = itm.ToString();
if (!Nums.Contains(item))
{
foreach (var itm2 in SumandNums)
{
var itm3 = itm2.Split(',');
if (item == itm3[1])
{
SumandNums2.Add(itm2);
if (string.IsNullOrEmpty(txt))
txt = itm3[0];
else
txt = txt + " " + itm3[0];
}
}
Nums.Add(item);
}
}
return txt;
}
static long GetSumOfDigits(long n)
{
long num2 = 0;
long num3 = n;
long r = 0;
while (num3 != 0)
{
r = num3 % 10;
num3 = num3 / 10;
num2 = num2 + r;
}
return num2;
}
}
如果只有一个但没有重复,我可以处理。请帮助我重写我的课程,以便它也可以处理重复的课程。
数字总和:
string weights = "103 123 4444 99 2000";
1) 2000, digit sum = 2;
2) 103, digit sum = 4;
3) 123, digit sum = 6;
4) 4444, digit sum = 16;
5) 99, digit sum = 18;
the correct order is "2000 103 123 4444 99"
如果按重量排序,则可以使用Linq
实施
String a = "56 65 74 100 99 68 86 180 90";
// 100 180 90 56 65 74 68 86 99
String result = String.Join(" ", a
.Split(' ')
.OrderBy(item => item.Sum(ch => ch - '0')) // sum of digits
.ThenBy(item => item)); // lexicographic ("as string")
数字的总和在哪里?
@ArchAngel:如果
a = "103 123 4444 99 2000"
我的实现的输出是2000 103 123 4444 99
您拥有最佳且可理解的解决方案。