leetcode 179 最大数

其实就是比较两个数的字符表示拼在一起哪个大,然后用这种判别原则去维护一个大顶堆。本来写了好几十行的判断代码,后来发现可以直接判断a+b和b+a的大小关系,感觉自己像个小丑。贴代码

 1 class Solution {
 2 public:
 3     string largestNumber(vector<int>& nums) 
 4     {
 5         //自定义大顶堆比较规则
 6         auto cmp = [](const string a, const string b) -> bool 
 7         { 
 8             return (a+b)<(b+a);
 9             /*if(a[0]!=b[0])
10             return a[0]<b[0];
11             else
12             {
13                 int i = 0;
14                 int la = a.length();
15                 int lb = b.length();
16                 while(a[i] == b[i] && i<la && i<lb)
17                 i++;
18                 //完全相同
19                 if(i == la && i == lb)
20                 {
21                     return a[i-1]<b[i-1];
22                 }
23                 //某一位开始存在不同
24                 else if(i<la && i<lb)
25                 {
26                     return a[i]<b[i];
27                 }
28                 //位数不同,且某一字符串为另一字符串前一部分
29                 else if(i>=la || i>=lb)
30                 {
31                     string longStr;
32                     string shortStr;
33                     int longLength;
34                     int shortlength;
35                     if(i>=la)
36                     {
37                         longStr = b;
38                         shortStr = a;
39                         longLength = lb;
40                         shortlength = la;
41                     }
42                     else 
43                     {
44                         longStr = a;
45                         shortStr = b;
46                         longLength = la;
47                         shortlength = lb;                       
48                     }
49                     int k = 0;
50                     //找不同
51                     while(longStr[i] == shortStr[k] && i<longLength)
52                     {
53                         i++;
54                         k++;
55                         if(k == shortlength)
56                         k = 0;
57                     }
58                     //长数组未越界
59                     if(i<longLength)
60                     {
61                         if(longStr == a)
62                         return a[i]<b[k];
63                         else
64                         return a[k]<b[i];
65                     }
66                     else
67                     return la<lb;
68                 }
69             }
70             return false;*/ 
71         };
72         priority_queue<string,vector<string>,decltype(cmp)> q(cmp);
73         string res;
74         string tempStr;
75         for(auto tempNum:nums)
76         {
77             tempStr = to_string(tempNum);
78             q.push(tempStr);
79         }
80         if(q.top() == "0")
81         {
82             res = "0";
83             return res;
84         }
85         while(!q.empty())
86         {
87             //cout<<q.top()<<endl;
88             res+=q.top();
89             q.pop();
90         }
91         return res;
92     }
93 };

 

上一篇:EN 179: 建筑五金件.逃生路线用手柄或推板操作的紧急出口装置.要求和试验方法CE认证


下一篇:4,12——179