其实就是比较两个数的字符表示拼在一起哪个大,然后用这种判别原则去维护一个大顶堆。本来写了好几十行的判断代码,后来发现可以直接判断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 };