赞
踩
欢迎转载,转载请注明出处,谢谢!
面试的时候经常有一道题就是给你多个数,让你拼接或者组合成一个最大的数字,如687,68,239,9,689,拼接后最大的数字应该为968968768239,题目一看很容易使人想到用贪心算法,对齐后每次选取当前最大数,但考虑到数字位数不一,需要加很复杂的控制,导致代码根本写不出,其实只要跳出这个局限算法就很容易实现了
让我们看一个最简单的例子,数组a存有1,2,3,4拼接成最大的数是4321,算法实现思路如下:
for i=0 to 3
for j=i+1 to 3
dif="a[i]拼接a[j]" - "a[j]拼接a[i]" //第一次拼接后是12-21
if(dif<0)
then
swap (a[i],a[j]) //第一次12-21<0所以交换他们,数组a变为 2,1,3,4
//后面就是重复比较直至最后4排到了最前面,一轮结束后就为4,1,2,3,然后从i=2
//开始又重新一轮,直至最后4321,即为所求
- #include <iostream>
- #include <cstdlib>
- #include <cmath>
- using namespace std;
- //int 转string
- string intToString(int num) {
- char p[255];
- sprintf(p, "%d", num);
- string s(p);
- return s;
- }
- //string转int
- int stringToint(const string&s) {
- return atoi(s.c_str());
- }
- //多个数组合合并为最大数,注意要将数组长度传入,在函数内部数组参数会转为指针,从而求不出长度
- void composeBiggest(int num[], int len) {
- int tempNum;
- string temp1, temp2;
- for (int i = 0; i<len; i++) {
- for (int j = i + 1; j<len; j++) {
- temp1 = intToString(num[i]) + intToString(num[j]);
- temp2 = intToString(num[j]) + intToString(num[i]);
- if (stringToint(temp1) - stringToint(temp2)<0) {
- tempNum = num[i];
- num[i] = num[j];
- num[j] = tempNum;
- }
- }
- }
- for (int i = 0; i<len; i++) {
- cout << num[i];
- }
- }
- int main(int argc, const char * argv[]) {
- int a[] = { 687,68,239,9,689 };
- composeBiggest(a, 5);
- return 0;
- }

最后可以得到正确结果,其实很多公司的相当大一部分编程算法题主要是技巧,不要想的太复杂了
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。