欢迎转载,转载请注明出处,谢谢!
面试的时候经常有一道题就是给你多个数,让你拼接或者组合成一个最大的数字,如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;
}
最后可以得到正确结果,其实很多公司的相当大一部分编程算法题主要是技巧,不要想的太复杂了