数组重组找最小--C语言

题目:给定一个整数数组,请将其重新排序,以构造最小值。
样例 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;
}

猜你喜欢

转载自blog.csdn.net/qq_45914759/article/details/104187824