Chinaunix首页 | 论坛 | 博客
  • 博客访问: 613914
  • 博文数量: 79
  • 博客积分: 848
  • 博客等级: 军士长
  • 技术积分: 1800
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-26 19:30
文章分类

全部博文(79)

文章存档

2015年(4)

2013年(39)

2012年(36)

分类: C/C++

2013-07-19 15:02:57

题目如下:
给定只包含正数的数组,给出一个方法,将数组中的数拼接起来,得到的数,是最大的。 例如: [4, 94, 9, 14, 1] 拼接之后,所得最大数为:9944141

看到这个题目,不知道大家有木有一种似曾相识的感觉,这个最大的排列规则,跟我们查字典的规则是相似的。在字典的排列中,按照首字母的顺序排列,单个字母总是放在字母群的最前面。而这里我们恰好是按照字典序的逆序,如何实现这种字典序的比较呢?
问题,现在就变成了给定两个正数如何实现字典序的比较了?我们将两个正数,变成两个字符串,然后依次比较对应的位置上的值,如果一个字符串长,一个字符串短,我们就要给短的字符串补上该字符串的末尾字符,来得出比较结果。

程序如下:

点击(此处)折叠或打开

  1. bool compare(int a, int b)
  2. {
  3.     stringstream ass, bss;
  4.     string as,bs;
  5.     ass << a;
  6.     bss << b;
  7.     ass >> as;
  8.     bss >> bs;
  9.     char *pa = const_cast<char*>(as.c_str());
  10.     char *pb = const_cast<char*>(bs.c_str());
  11.     while(*pa && *pb)
  12.     {
  13.         if(*pa > *pb)
  14.         {
  15.             return true;
  16.         }
  17.         else if(*pa < *pb)
  18.         {
  19.             return false;
  20.         }
  21.         else
  22.         {
  23.             pa++;
  24.             pb++;
  25.         }
  26.     }
  27.     if(*pa)
  28.     {
  29.         if(*pa <= *(--pb))
  30.         {
  31.             return false;
  32.         }
  33.         else
  34.         {
  35.             return true;
  36.         }
  37.     }
  38.     else
  39.     {
  40.         if(*pb <= *(--pa))
  41.         {
  42.             return true;
  43.         }
  44.         else
  45.         {
  46.             return false;
  47.         }
  48.     }
  49. }

得到了上面的比较方法,我们再来排列源数组,然后输出结果就很容易了:

点击(此处)折叠或打开

  1. void getMax2(int *arr, const int size)
  2. {
  3.     sort(&arr[0], &arr[size], compare);
  4.     int i;
  5.     for(i = 0; i < size; i++)
  6.     {
  7.         cout << arr[i];
  8.     }
  9.     cout << endl;
  10. }
ok!大功告成!!

阅读(1507) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

fibers2013-10-24 16:17:20

如果有一个数是9. 另一个数是991. 歇!