给定只包含正数的数组,给出一个方法,将数组中的数拼接起来,得到的数,是最大的。
2013-07-21 12:33
429 查看
问题:
给定只包含正数的数组,给出一个方法,将数组中的数拼接起来,得到的数,是最大的。如果a[5]={10,110,1110,1,1},则所得的最大数为11111011010.
分析:
首先,我们需要明确的是最后得到的数字,一定是原数组元素的一个排列,比如给定数组为[3, 30, 34, 5, 9],最终所得的最大数字为9534330就可以看成是原数组的一个排列[9, 5, 34, 3, 30]。我们可以通过枚举原数组的所有排列,然后把最大值保存下来,不过这样做的时间复杂度为
![](http://latex.codecogs.com/gif.latex?\dpi{100}&space;\fn_jvn&space;O(n!))
,在实际中显然是不可取的,所以我们需要寻找更高效的方法.
我们考查数组a中的任意两个元素,假设其在数组中的下标分别为i和j,那么i和j的位置有两种情况:相邻和不相邻。首先,我们看一下i和j相邻的情况。假设i和j相邻,那么,我们只用比较a[i] + a[j]和a[j] + a[i]的大小就能判断i和j的位置关系(注:此处的+不是数学中传统的加减法,是连接的意思)。由此我们也很容易得出,最终所要求的满足条件的排列,一定存在这样的一个关系:
&space;+&space;a[i&space;+1]>=a[i&space;+&space;1]&space;+&space;a[i](i\epsilon&space;[0,n-2])]
![](http://latex.codecogs.com/png.latex?\dpi{100}&space;\fn_jvn&space;a[i]&space;+&space;a[i&space;+1]>=a[i&space;+&space;1]&space;+&space;a[i](i\epsilon&space;[0,n-2]))
而求解出这个满足条件的排列的过程可以看成是冒泡排序(便于理解),只是比较元素的大小的规则不同。根据此关系,我们可以证明在满足该关系的条件下交换任意两个不相邻的元素,只会导致最终解小于或者等于,故此时的解即为最优解。
给定只包含正数的数组,给出一个方法,将数组中的数拼接起来,得到的数,是最大的。如果a[5]={10,110,1110,1,1},则所得的最大数为11111011010.
分析:
首先,我们需要明确的是最后得到的数字,一定是原数组元素的一个排列,比如给定数组为[3, 30, 34, 5, 9],最终所得的最大数字为9534330就可以看成是原数组的一个排列[9, 5, 34, 3, 30]。我们可以通过枚举原数组的所有排列,然后把最大值保存下来,不过这样做的时间复杂度为
,在实际中显然是不可取的,所以我们需要寻找更高效的方法.
我们考查数组a中的任意两个元素,假设其在数组中的下标分别为i和j,那么i和j的位置有两种情况:相邻和不相邻。首先,我们看一下i和j相邻的情况。假设i和j相邻,那么,我们只用比较a[i] + a[j]和a[j] + a[i]的大小就能判断i和j的位置关系(注:此处的+不是数学中传统的加减法,是连接的意思)。由此我们也很容易得出,最终所要求的满足条件的排列,一定存在这样的一个关系:
&space;+&space;a[i&space;+1]>=a[i&space;+&space;1]&space;+&space;a[i](i\epsilon&space;[0,n-2])]
而求解出这个满足条件的排列的过程可以看成是冒泡排序(便于理解),只是比较元素的大小的规则不同。根据此关系,我们可以证明在满足该关系的条件下交换任意两个不相邻的元素,只会导致最终解小于或者等于,故此时的解即为最优解。
bool cmp(const string &a, const string &b) { return a + b > b + a; } string largestNumbers(vector<int> &num) { vector<string> rec; for (int i = 0; i < num.size(); ++i) { char tmp[15]; sprintf(tmp, "%d", num[i]); rec.push_back(string(tmp)); } sort(rec.begin(), rec.end(), cmp); return accumulate(rec.begin(), rec.end(), string("")); }
相关文章推荐
- 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大 java实现
- 新浪微博 陈利人 面试题 给定k个数组,每个数组有k个整数。每个数组中选取一个整数,一共k个整数,取其和,一共可以得到k^k个和。给出方法,求得这k^k个和中,最小的k个。
- 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大
- 程序员面试金典——解题总结: 9.18高难度题 18.8给定一个字符串s和一个包含较短字符串的数组T,设计一个方法,根据T中的每一个较短字符串,对s进行搜索
- 给定一个单调递增有序数组A,给定一个数字N,试给出一个算法得到A中该数字N出现的次数。
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型数组排序,使得按序拼接数组各元素得到的值最小。
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小。
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
- 给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和。
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小
- 堆的数据结构能够使得堆顶总是维持最大(对于大根堆)或最小(对于小根堆),给定一个数组,对这个数组进行建堆,则平均复杂度是多少?如果只是用堆的 push 操作,则一个大根堆依次输入 3,7,2,4,1,5,8 后,得到的堆的结构示意图是下述图表中的哪个?
- 程序员面试金典——解题总结: 9.17中等难题 17.8给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和
- 给定一个正整数数组,找所有元素组合起来最大的值(答案)
- 给定一个正整数数组求组合起来的最大值
- 给定一个整数(字符串也适用)序列,重新排列,得到最大的结果,比如31,3,35,7,9根据排列后得到组合 9735331,返回的是string类型
- js采用concat和sort将N个数组拼接起来的方法
- 最大堆---实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
- 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中
- 请给Array本地对象增加一个原型方法,它的用途是删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。
- Java编程:定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。