题目:给定一个整数数组,请将其重新排序,以构造最小值。
样例 2:
输入:[3, 32, 321]
输出:[321, 32, 3]
解释:通过将数组重新排序,可构造 6 个可能性数字:
3+32+321=332321
3+321+32=332132
32+3+321=323321
32+321+3=323213
321+3+32=321332
321+32+3=321323
其中,最小值为 321323,所以,将数组重新排序后,该数组变为 [321, 32, 3]。
解题思路:(一开始用整数来写,还需要保存每个数的位数,改用字符串,就可以解决这个问题)
先用二维数组保存获得字符串。再对每个字符串进行处理,并把字符串存在链表中,存入方式有两种(从头进,从尾进)。
代码
//寻找
Link *head, *p;
char temp[9];//temp,用于存储最后的最小数。
int sign;//sign,判断从头进,还是从尾进。
LinkInit(&head);
LinkInsertTop(head, nums[0]);
p = head->next;
strcpy(temp, nums[0]);
for (i = 1; i < num; i++)
{
sign=ZuHe(temp, nums[i]);
if (sign == 0)
{
LinkInsertTop(head, nums[i]);
}
else if (sign == 1)
{
LinkInsertTail(head, nums[i]);
}
}
②将字符串进行处理
int ZuHe(char[], char[]);
int ZuHe(char x[], char y[])
{
char t1[9] = { 0 }, t2[9] = {0};//用于保存x和y。
strcpy(t1, x);
strcpy(t2, y);
strcat(t1, t2);
strcat(t2, t1);
if (strcmp(t1, t2) <= 0)
{
strcpy(x, t1);
return 1;//尾巴
}
else
{
strcpy(x, t2);
return 0;//头
}
}
void LinkInsertTop(Link *head, char nums[9]);
void LinkInsertTop(Link *head, char nums[9])
{
Link *p;
p = (Link*)malloc(sizeof(Link));
strcpy(p->nums,nums);
p->next = head->next;
head->next = p;
}
void LinkInsertTail(Link *head, char nums[9]);
void LinkInsertTail(Link *head, char nums[9])
{
Link *p, *q;
p = (Link*)malloc(sizeof(Link));
strcpy(p->nums, nums);
q = head;
while (q->next)
{
q = q->next;
}
p->next = q->next;
q->next = p;
}