C#实现:给定[0-9]数组,求用数组组成的任意数字的最小值

 class Program
    {
        static void Main(string[] args)
        {

            List<int> c = new List<int>() { 1, 2, 3, 4, 5 };
            c.Sort();
            var result = getNumber(c, 27423536);
            Console.WriteLine("{0}", result);

            Console.ReadKey();

        }

        private static int getNumber(List<int> c, int k)
        {
            c.Sort();
            int result = 0;
            int kk = k;
            List<int> eachNum = new List<int>();
            //convert each bit of k to a list.
            while (k != 0)
            {
                eachNum.Add(k % 10);
                k = k / 10;
            }
            //get the each bit which is larger or equal the same position of k.
            for (int i = eachNum.Count - 1; i >= 0; i--)
            {
                result = result * 10 + getCurrentNum(c, eachNum[i]);
            }

            //If the result by below is small than target. Replace the number from low position.
            int j = 0;
            while (result <= kk && j < eachNum.Count)
            {
                j++;
                if (c.Where(item => item > eachNum[j - 1]).Count() == 0)
                {

                    continue;
                }

                result = (result / (int)Math.Pow(10, j)) * (int)Math.Pow(10, j);
                result = result + getMinValLargerThanT(c.Where(item => item > eachNum[j - 1]).First(), c.First(), j - 1);

            }

            //If the result is still small than target, carry in adding.
            if (result <= kk)
            {
                result = getMinValLargerThanT(c.Where(item => item > 0).First(), c.First(), eachNum.Count);
            }

            return result;
        }

        public static int getMinValLargerThanT(int firstIsNotZero, int firstNum, int length)
        {
            int result = firstIsNotZero;
            for (int i = 0; i < length; i++)
            {
                result = result * 10 + firstNum;
            }
            return result;
        }

        //Get for each number min value larger than the same position.
        public static int getCurrentNum(List<int> c, int highNum)
        {
            foreach (int cItem in c)
            {
                if (cItem >= highNum)
                {
                    return cItem;
                }
            }
            return 0;
        }
    }

时间: 2024-10-25 04:33:10

C#实现:给定[0-9]数组,求用数组组成的任意数字的最小值的相关文章

求一个数组中a[0...i-1] 离a[i]最接近的值

博客主页:http://blog.csdn.net/minna_d 题目: 给一个n个元素的线性表A,对于每个数Ai,找到它之前的数中,和它最接近的数.即对于每个i,计算 Ci = min{|Ai-Aj| | 1<=j<i} 规定C1 = 0. 其实就是给定一个数组, 在a[0....i-1]中求离a[i]最近的值, 其实这里有个bug,那就是,如果对与6而言5,7都离它一样, 那么该输出谁呢 N久不写C, 感觉怪怪的, 写了一个java版. 思路: 用一个临时数组存储,离a[i]最近值 用另

树状数组求逆序对

给定n个数,要求这些数构成的逆序对的个数.除了用归并排序来求逆序对个数,还可以使用树状数组来求解.树状数组求解的思路:开一个能大小为这些数的最大值的树状数组,并全部置0.从头到尾读入这些数,每读入一个数就更新树状数组,查看它前面比它小的已出现过的有多少个数sum,然后用当前位置减去该sum,就可以得到当前数导致的逆序对数了.把所有的加起来就是总的逆序对数.题目中的数都是独一无二的,这些数最大值不超过999999999,但n最大只是500000.如果采用上面的思想,必然会导致空间的巨大浪费,而且由

[nowCoder] 两个不等长数组求第K大数

给定两个有序数组arr1和arr2,在给定一个整数k,返回两个数组的所有数中第K小的数.例如:arr1 = {1,2,3,4,5};arr2 = {3,4,5};K = 1;因为1为所有数中最小的,所以返回1: arr1 = {1,2,3};arr2 = {3,4,5,6};K = 4;因为3为所有数中第4小的数,所以返回3: 要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M,N})). 这题目的难度在于时间复杂度请达到O(log(min{M,N})),参

[经典面试题][淘宝]求首尾相连数组的最大子数组和

题目 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],-arr[n-1],arr[0],-,arr[j],现在请你这个ACM_Lover用一个最高效的方法帮忙找出所有连续子数组和的最大值(如果数组中的元素全部为负数,则最大和为0,即一个也没有选). 输入: 输入包含多个测试用例,每个测试用例共有两行,第一行是一个整数n(1<=n<= 100000),表示数组的长度

求数组中和为给定值的任意两个数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/24933341     题目: 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11.     思路: 最直接的做法是暴力法,两个for循环,时间复杂度为O(n*n),但是这样没有充

给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

题目描述: 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除. 输入: 两个整数n(2<=n<=1000),a(2<=a<=1000) 输出: 一个整数. 样例输入: 6 10 样例输出: 1 这个题首先如果数字小的话是可以考虑轮流试的,但是1000的数字范围无论是对阶乘还是幂都太大了.于是我们想一下,既然要求整除,说明每个素因子都是可以抵消的,这样我们就可以求解了.但是还要考虑到,因为后面是求哪个k,所以说我们不是对n!和a的幂分别求出对应的素数因子数组.我

N个数的数组求N-1个数组合乘积最大的一组

1 /* 2 编程之美题,给定N个数的数组,只能使用乘法,不使用除法,找出N-1个数的乘积最大的一组,有两种方法,方法一:采用两个数组分别保存从左向右 3 和从又向左的两个乘积值,然后在扫描一次,求出最大乘积,空间换时间的方法. 4 方法二:通过分析这些数的性质,看有多少正数,多少负数,多少0 5 (1)如果有2个或2个以上的0,则返回0 6 (2)如果有一个0,则看去除0后的乘积为正数还是负数,如果是负数,最大值为0,返回0(即当有一个0时,看负数奇偶情况,如果负数个数是奇数,则返回0) 7

一道数组求连续子集最大值的题目。

昨天晚上花了几个小时,终于把这个题目给实现了.后面再优化.今天先贴出来晒晒. 据说是浙江大学计算机系一道考研题目(给定一个有符号整形数组,输出和胃最大并且连续的子数组).当初只会算最大值,不会返回一个数组作为结果.花了点时间,把程序改进了一下.有些不成熟.先放放.好歹是实现了. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SumMax { class

POJ - 3261 Milk Patterns (后缀数组求可重叠的 k 次最长重复子串)

Description Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation, he discovered that although he can't predict the quality of milk from one day to the next, there are some regular pattern