目录
题目
思路讲解
代码(加注释)
题目
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如,输入数组{3,32,321},打印出这3个数字能排成的最小数字321323。
思路讲解
方法一:将所有数字进行全排列然后进行比大小,该方法显然效率较低,
方法二:我们可以将数字进行由大到小进行排序,然后进行排序输出即可,然后排序的方法又有较多不同,例如:321,32,3;我们排序便是321,32,3此处看似从小到大排序
例如:234 ,3, 4, 5,我们排序便是234,3,4,5;此处又是不按顺序排序,
其实我们认真研究便可以发现第二种是类似于我们的字符串比较的方式,由小到大进行排序,但是第一种例子又不是用该方法进行排序,我们可以发现第二种是与其他不同之处在于第一种的他们的首元素是相同的,因此我们有这么一种方法比较大小
如下:将数字转换成字符串进行比较大小,首先我们从首元素进行比较大小,谁较大便是哪个元素大,若相同,则继续进行比较,直到找到不相同的元素,但是此处又进行分类:不相同时若两元素均没遍历完,便可直接比大小,若均遍历完则两者大小相同,若一方遍历完另一方没遍历完则遍历完的较大,(此处数组字均为从大到小 例如321,不能输入341,因为此处思路没整理好,望理解);
然而又要如何将数字转换为字符数字呢,因为数字位数较多,我们使用二维数组,将数组中的数字按位赋值给二维数组例如:321,32,3赋值之后便是3,2,1, ,3,2, 3 , , ,第一行元素为3,2,1,第二行为3,2 ,' ',第三行: 3,' ' , ' ',然后比较数组大小便是按照行数比较。
代码:
int lenbrr(int a){//求元素(数字)长度
int count=0;
while (a > 0){
a /= 10;
count++;
}
return count;
}
int cmp(char(*arr)[100],int j,char (*vlan)[100]){//比较大小,将第j行和基准值进行比较
int m = 0;
int count=9;
while (vlan[0][m] == arr[j][m]){
if (vlan[0][m] == ' ') return 0;
m++;
}
if (arr[j][m] == ' '&&vlan[0][m] != ' ') return 1;
if (arr[j][m] != ' '&&vlan[0][m] == ' ') return -1;
if (arr[j][m] != ' '&&vlan[0][m] != ' ') return arr[j][m] > vlan[0][m] ? 1 : 1;
}
int long_s(char(*arr)[100], int i, int j){//求第i行和第j行的数字哪个长
int m = 0,count1=0;
while (arr[i][m] != ' ') {
count1++;
m++;
}
int n = 0, count2 = 0;
while (arr[j][n] != ' ') {
n++;
count2++;
}
return count1 > count2 ? i : j;
}
void fz(char(*arr)[100], int i, int j){//数组行数赋值,第j行赋值给第i行
int m = 0;
int longs = long_s(arr,i,j);
while (arr[longs][m]!=' '){
arr[i][m] = arr[j][m];
m++;
}
}
void cpy(char(*arr)[100], int i, char(*vlan)[100]){//赋值,将基准值赋值
int m = 0;
while (m<100){
arr[i][m] = vlan[0][m];
m++;
}
}
void my_qsort(char(*arr)[100], int left,int right){//快排 此处是将二维数组按行进行排序
int count = 0;
int i = left, j = right;//定义两边移动的变量
char vlan[1][100] = { };//基准值
int m = 0;
while (arr[left][m] != ' '){//对基准值进行赋值
vlan[0][m] = arr[left][m];
m++;
}
while (i < j){
while (i < j && ((cmp(arr, j, vlan) == 0) || (cmp(arr, j, vlan) == 1))){
j--;//此处cmp函数为比较字符串大小的函数,从后往前找比基准值小的数字
}
fz(arr, i, j);//赋值函数将二维数组第j行赋值给第i行
while (ileft)
my_qsort(arr, left, i - 1);//函数递归
if (i + 1 0);//断言
char arr[100][100] = {0};//定义一个二维数组
for (int i = 0; i < len; i++){
int vlan = (int)lenbrr(brr[i]);//len表示brr[i]数字的长度
for (int j = 0; j < vlan; j++)//将brr的每一位元素的数字按从高到底一位以为赋值给二维数组arr
{//此处方法为除以位数取余赋值
arr[i][j] = brr[i] / (int)pow(10, (double)lenbrr(brr[i])-1) + '0';
brr[i] -= (brr[i] / (int)pow(10, (double)lenbrr(brr[i]) - 1))*(int)pow(10, (double)lenbrr(brr[i]) - 1);
}
}
my_qsort(arr, 0,len-1);//快排
for (int i = 0; i < len; i++){
for (int j = 0; j <100; j++){
if(isdigit(arr[i][j])) printf("%c", arr[i][j]);//判断是数字输出
}
}
}



