0 引言
问题:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
1 抽象问题具体化
举例1:输入数组{3,32,321},打印出这三个数字能排成的最小数字.
1. 3与32相比,332 > 323,故32排在3的前边,得到序列32,3;
2. 321与3相比,3321 > 3213,故321排在3的前边;321与32相比,32321 > 32132,321排在32的前边,得到序列321,32,3;
3. 打印序列321323.
2 具体问题抽象分析
1. 定义排序规则:将两个数用字符串的形式拼接起来,比较大小之后,返回结果.
2. 将所有数拼接起来,输出即可.
3. 为了便于对数中的每个数字单独处理,将数转成字符串.
3 demo
// 排序规则,默认str1在str2的后面;返回true时,交换二者顺序; bool compareNums(string str1, string str2){ long num1 = stol(str1 + str2); long num2 = stol(str2 + str1); if( num1 > num2) return false; else return true; } string PrintMinNumber(vector<int> numbers) { for(int i=1;i < numbers.size();i++){ for(int j=i;j>0;j--){ if(compareNums(to_string(numbers[j]),to_string(numbers[j-1]))){ int temp = numbers[j]; numbers[j] = numbers[j-1]; numbers[j-1] = temp; } } } string myString = ""; for(int i=0;i<numbers.size();i++) myString += to_string(numbers[i]); return myString; }
4 代码优化