问题:
1. 输入一个个数较大的正整数数组[数字范围在0~9999],将部分数组元素的十进制表示连接起来排成一个数,输出能排出的所有数字中最大的一个。find例如输入数组{3423,33,456,9,8,7,21}和3,则输出的最大数为:456342333。
要求:
(1) 输出数字用十进制字符串表示
(2)除打印函数和内存创建/销毁函数外,不得使用其它库函数,如需要相似功能,请自己实现;
解题思路:
首先根据需要取出的元素个数得到数组中最大的n元素,将其转化成字符串存放到字符串数组中,然后将字符串数组中的元素的第一个字符进行比较,将大的放到前面,如果相等就比较第二个,以此类推(最多比较四次,如果都相等,则两个元素就完全相等也没有必要再去交换一次了)。排好序后将其连接就可以了。
代码:
class Program
{
static void Main(string[] args)
{
int[] array = { 3423, 33, 456, 9, 8, 7, 21 };
Console.WriteLine(largestNumber(array, 3));
}
static String largestNumber(int[] array, int numbers)
{
string result = "";
String[] sum = new String[numbers];
if (numbers >= 1 && numbers <= array.Length)
{
for (int i = 0; i < numbers; i++)
{
for (int j = i; j < array.Length - 1; j++)
{
if (array[j] <= array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
sum[i] = array[i].ToString();
}
result = Count(sum);
}
return result;
}
static String Count(string[] sum)
{
string result = "";
for (int i = 0; i < sum.Length; i++)
{
for (int j = i; j < sum.Length - 1; j++)
{
if (!Cycle(sum[j], sum[j + 1]))
{
String temp = sum[j];
sum[j] = sum[j + 1];
sum[j + 1] = temp;
}
}
result += sum[i];
}
return result;
}
//循环比较字符串数组中元素的大小
static bool Cycle(string a, string b)
{
for (int i = 0; i < 4; i++)
{
if (a[i] > b[i])
{
return true;
}
else if (a[i] == b[i])
{
if (i == 3)
{
return true;
}
continue;
}
else
{
return false;
}
}
return true;
}
}
当然上面的解题算法没有使用到任何的库函数,下面是使用了库函数的一种解法。
代码:
int[] arr = { 3423, 33, 456, 9, 8, 7, 21 };
int n = 3;
var result = arr.OrderByDescending(x => x.ToString().Length) //取最长的
.Take(n) //n个
.OrderByDescending(x => x.ToString());//按字符串排序
Console.WriteLine(string.Join("", result));//拼接