当前位置:   article > 正文

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

组合最大数cpp

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

 面试的时候经常有一道题就是给你多个数,让你拼接或者组合成一个最大的数字,如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,即为所求

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cmath>
  4. using namespace std;
  5. //int 转string
  6. string intToString(int num) {
  7. char p[255];
  8. sprintf(p, "%d", num);
  9. string s(p);
  10. return s;
  11. }
  12. //string转int
  13. int stringToint(const string&s) {
  14. return atoi(s.c_str());
  15. }
  16. //多个数组合合并为最大数,注意要将数组长度传入,在函数内部数组参数会转为指针,从而求不出长度
  17. void composeBiggest(int num[], int len) {
  18. int tempNum;
  19. string temp1, temp2;
  20. for (int i = 0; i<len; i++) {
  21. for (int j = i + 1; j<len; j++) {
  22. temp1 = intToString(num[i]) + intToString(num[j]);
  23. temp2 = intToString(num[j]) + intToString(num[i]);
  24. if (stringToint(temp1) - stringToint(temp2)<0) {
  25. tempNum = num[i];
  26. num[i] = num[j];
  27. num[j] = tempNum;
  28. }
  29. }
  30. }
  31. for (int i = 0; i<len; i++) {
  32. cout << num[i];
  33. }
  34. }
  35. int main(int argc, const char * argv[]) {
  36. int a[] = { 687,68,239,9,689 };
  37. composeBiggest(a, 5);
  38. return 0;
  39. }



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






声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/252546?site
推荐阅读
相关标签
  

闽ICP备14008679号