我正在关注this博客提问 每个软件工程师应该能够在不到1小时内解决五个编程问题
我完全被问题4困扰(5也是另一个故事)
编写一个给出非负整数列表的函数,对它们进行排列,使它们形成尽可能大的数字。例如,给定[50,2,1,9],最大形成数为95021。
现在作者posted得到答案,我也看到了蟒蛇的尝试:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
但我不会很快学会这些语言。是否有人愿意分享他们如何对C#中的数字进行排序以形成最大的数字?
我也尝试在VaryCode中直接转换为C#,但是当IComparer参与其中时,它会导致错误的转换。
python尝试似乎使用冒泡排序。 泡沫是一个起点吗?还会用什么?
答案 0 :(得分:1)
所提出的解决方案使用该方法以特殊方式对数组中的数字进行排序。例如,值5
位于50
之前,因为"505"
("50"+"5"
)位于"550"
之前("5"+"50"
)。这背后的想法没有解释,我不相信它确实有效......
当看到问题时,我找到了这个解决方案:
你可以递归地做。创建一个循环遍历数组中数字的方法,并将每个数字连接到剩余数字可以形成的最大值,以查看其中哪一个最大:
public static int GetLargest(int[] numbers) {
if (numbers.Length == 1) {
return numbers[0];
} else {
int largest = 0;
for (int i = 0; i < numbers.Length; i++) {
int[] other = numbers.Take(i).Concat(numbers.Skip(i + 1)).ToArray();
int n = Int32.Parse(numbers[i].ToString() + GetLargest(other).ToString());
if (i == 0 || n > largest) {
largest = n;
}
}
return largest;
}
}
答案 1 :(得分:1)
如果您想通过冒泡排序来实现,请尝试以下方法:
public static void Main()
{
bool swapped = true;
while (swapped)
{
swapped = false;
for (int i = 0; i < VALUES.Length - 1; i++)
{
if (Compare(VALUES[i], VALUES[i + 1]) > 0)
{
int temp = VALUES[i];
VALUES[i] = VALUES[i + 1];
VALUES[i + 1] = temp;
swapped = true;
}
}
}
String result = "";
foreach (int integer in VALUES)
{
result += integer.ToString();
}
Console.WriteLine(result);
}
public static int Compare(int lhs, int rhs)
{
String v1 = lhs.ToString();
String v2 = rhs.ToString();
return (v1 + v2).CompareTo(v2 + v1) * -1;
}
Compare
方法比较将创建最大数字的两个数字的顺序。当它返回大于0的值时,这意味着你需要交换。
这是排序部分:
while (swapped)
{
swapped = false;
for (int i = 0; i < VALUES.Length - 1; i++)
{
if (Compare(VALUES[i], VALUES[i + 1]) > 0)
{
int temp = VALUES[i];
VALUES[i] = VALUES[i + 1];
VALUES[i + 1] = temp;
swapped = true;
}
}
}
它会检查数组中的连续值,并在必要时进行交换。在没有交换的一次迭代之后,排序结束。
最后,您连接数组中的值并将其打印出来。