Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9]
, the
largest formed number is 9534330
.
Note: The result may be very large, so you need to return a string instead of an integer.
思路首先:为了能凑成最大数,开头大的数成为新数的起始位。同一时候题目说了是排序问题
那么显然我们应该依照"字典"顺序来排数可是我们又不能简单的依照字典顺序,
举例:[3, 30, 34, 5, 9]已经是字典顺序了,可是“最大数”顺序应该为[30, 3, 34, 5, 9],所以9534330
所以规则应该例如以下:
给定两个非负整数:a, b
将它们转换成字符串形式,然后进行连接。可得两种结果:
a在前,b在后,记为:strAB
b在前。a在后。记为:strBA
假设strAB > strBA,那么排序时a在b的前面。
class Solution { public: //不能简单的按字典序排序即小的在前面。 //比方32的字典序比322小,可是32322比32232大。 static bool cmp(const string &str1, const string &str2) //为什么这里要加一个static keyword才行??????? { string _str1 = str1; string _str2 = str2; _str1.append(str2);//在_str1后面追加str2字符串 _str2.append(str1); return _str2 < _str1;//true则将对原字符串顺序颠倒,否则不处理 } string largestNumber(vector<int>& nums) { int len=nums.size(); string strnum[1000]; string result; if(len==0) return result; for (int i = 0; i < len; i++) strnum[i] = to_string(nums[i]); //将数字转换到strnum数组中 sort(strnum,strnum+len,cmp); for (int i = 0; i < len; i++) result.append(strnum[i]); //将字符数字转换到结果字符串中 auto pos = result.find_first_not_of('0'); return pos == string::npos ?"0" : result.substr(pos); } };
学习别人的代码,精炼.....:
class Solution { public: string largestNumber(vector<int>& nums) { sort(nums.begin(), nums.end(), compare);//直接对数组进行自己定义的字典顺序“排序” string res; for (auto n : nums) res += to_string(n); auto pos = res.find_first_not_of('0');//找到第一个不为‘0’的位置 return pos == string::npos ? "0" : res.substr(pos);//假设位置pos不存在(即全是‘0’)则返回‘0’,否则返回pos開始的子字符串 } private: static bool compare(int a, int b) { auto strA = to_string(a); auto strB = to_string(b); return (strA + strB > strB + strA); } };
本题參考曾经在九度写的代码:
题目1504:把数组排成最小的数
- 题目描写叙述:
-
输入一个正整数数组。把数组里全部数字拼接起来排成一个数,打印能拼接出的全部数字中最小的一个。
比如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 输入:
-
输入可能包括多个測试例子。
对于每一个測试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包含m个正整数,当中每一个正整数不超过10000000。
- 输出:
-
相应每一个測试案例,
输出m个数字能排成的最小数字。
- 例子输入:
-
3 23 13 6 2 23456 56
- 例子输出:
-
13236 2345656
#include "vector" #include <iostream> #include "algorithm" #include<string> #include <stdio.h> #include<cmath> #include<cstdlib> using namespace std; long long numbers[200]; string str_num[200]; //不能简单的按字典序排序即小的在前面。 //比方32的字典序比322小,可是32322比32232大, bool cmp(const string &str1, const string &str2) { string _str1 = str1; string _str2 = str2; _str1.append(str2);//在_str1后面追加str2字符串 _str2.append(str1); return _str1 < _str2;//true则将对原字符串顺序颠倒,否则不处理 } int main() { int n; while (scanf("%d", &n) != EOF) { //接受输入 for (int i = 0; i < n; i++) scanf("%d", numbers + i); for (int i = 0; i < n; i++) { char str[20]; sprintf(str, "%d", numbers[i]);//将数字转换到str内存中 str_num[i] = str; } sort(str_num, str_num + n, cmp); for (int i = 0; i < n; i++) cout << str_num[i]; cout << endl; } return 0; } /************************************************************** Problem: 1504 User: EbowTang Language: C++ Result: Accepted Time:220 ms Memory:1524 kb ****************************************************************/
注:本博文为EbowTang原创,兴许可能继续更新本文。
假设转载。请务必复制本条信息。
原文地址:http://blog.csdn.net/ebowtang/article/details/50511705
原作者博客:http://blog.csdn.net/ebowtang