C/C++实现多个数的拼接(组合)成最大数字

欢迎转载,转载请注明出处,谢谢!

 面试的时候经常有一道题就是给你多个数,让你拼接或者组合成一个最大的数字,如687682399689,拼接后最大的数字应该为968968768239,题目一看很容易使人想到用贪心算法,对齐后每次选取当前最大数,但考虑到数字位数不一,需要加很复杂的控制,导致代码根本写不出,其实只要跳出这个局限算法就很容易实现了

 让我们看一个最简单的例子,数组a存有1234拼接成最大的数是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变为 2134

//后面就是重复比较直至最后4排到了最前面,一轮结束后就为4123,然后从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;
}



 最后可以得到正确结果,其实很多公司的相当大一部分编程算法题主要是技巧,不要想的太复杂了 






  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值