面试题之算法面试题(一)

问题:

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));//拼接

猜你喜欢

转载自blog.csdn.net/qq_38721111/article/details/82292072