非负整数列表 - 连接成最大可能的nr - 例如[1,2,5] = 521

时间:2015-05-09 20:09:59

标签: c#

我正在关注this博客提问 每个软件工程师应该能够在不到1小时内解决五个编程问题

我完全被问题4困扰(5也是另一个故事)

编写一个给出非负整数列表的函数,对它们进行排列,使它们形成尽可能大的数字。例如,给定[50,2,1,9],最大形成数为95021。

现在作者posted得到答案,我也看到了蟒蛇的尝试:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

但我不会很快学会这些语言。是否有人愿意分享他们如何对C#中的数字进行排序以形成最大的数字?

我也尝试在VaryCode中直接转换为C#,但是当IComparer参与其中时,它会导致错误的转换。

python尝试似乎使用冒泡排序。 泡沫是一个起点吗?还会用什么?

2 个答案:

答案 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;
        }
    } 
}

它会检查数组中的连续值,并在必要时进行交换。在没有交换的一次迭代之后,排序结束。

最后,您连接数组中的值并将其打印出来。