• 构造最大数


    /*
    题目:给定只包含正整数的数组,给出一个方法,将数组中的数拼接起来,得到的数是最大的。
    例如[4,94,9,14,1]拼接之后所得的最大数为:9944141
    */
    #include <iostream>
    #include <assert.h>
    using namespace std;
    void swap(int *a, int *b)
    {
         int tmp = *a;
         *a = *b;
         *b = tmp;
    }
    int get_digit(int x)//得到数x的位数,个位返回1,十位返回2,以此类推
    {
         int n = 0;
         while(x % 10)
         {
              ++n;
              x /= 10;
         }
         return n;
    }
    int pow(int n, int base)//求base的n次幂
    {
         int res = 1;
         for (int i = 0; i < n; ++i)
         {
              res *= base;
         }
         return res;
    }
    int get_new_num(int lhs, int rhs)//利用lhs和rhs构造一个新数,其中lhs在高位,rhs在低位
    {
         int n = get_digit(rhs);
         int res = lhs * pow(n, 10) + rhs;
         return res;
    }
    void get_max_num(int *array, int len)//得到构造的最大数,改变原数组内的元素次序
    {
         assert(NULL != array);
         int tmp, left_num, right_num;
         bool is_changed = true;
         while(is_changed)//循环直到遍历一轮数组后数组没有任何改变为止,此时数组顺序存储了构造的最大数的各个位上的数
         {
              is_changed = false;
              for(int i = 0; i != len-1; ++i)
              {
                   left_num = get_new_num(array[i], array[i+1]);//left_num = array[i]array[i+1]
                   right_num = get_new_num(array[i+1], array[i]);//right_num = array[i+1]array[i]
                   if(left_num < right_num)//如果新构造的数left_num小于right_num,则将数组右边的数和数组左边的数交换
                   {
                        swap(&array[i], &array[i+1]);
                        is_changed = true;
                   }
              }
         }
    }
    int main(int argc, char const *argv[])
    {
         int array[] = {4, 94, 9, 14, 1};
         int len = 5;
         get_max_num(array, len);
         cout<<"The max number is ";
         for(int i = 0; i != len; ++i)
              cout<<array[i];
         cout<<endl;
         return 0;
    }
    

      

  • 相关阅读:
    ASP.NET MVC 5
    Web Components是不是Web的未来
    如何选择高性价比的控件产品
    ASP.NET MVC 5
    ubuntu系统安装
    Ubuntu linux安装完成后隐藏linux磁盘挂载点
    win10 查看本机的激活秘钥
    windows cmd下列出当前目录下的所有文件
    error LNK2005: “找到一个或多个多重定义的符号” 已经在 xxxx.obj 中定义 的解决方法
    架构设计:负载均衡层设计方案(3)——Nginx进阶
  • 原文地址:https://www.cnblogs.com/zxh1210603696/p/3201643.html
Copyright © 2020-2023  润新知