【
给你两个数组,arr1
和 arr2
,
arr2
中的元素各不相同arr2
中的每个元素都出现在arr1
中
对 arr1
中的元素进行排序,使 arr1
中项的相对顺序和 arr2
中的相对顺序相同。未在 arr2
中出现过的元素需要按照升序放在 arr1
的末尾。
示例:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]
提示:
arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2
中的元素arr2[i]
各不相同arr2
中的每个元素arr2[i]
都出现在arr1
中
】
没什么好说的,见到数组先想排序。这道题就是剩余字符串排个序。总体思路如下:
一、先把arr2中相同元素拷贝出来到arr3。
二、把剩余元素拷贝进数组arr4,qsort排个序。
三、把arr3、arr4再拷贝回arr1进行覆盖.
int Comp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
void Copytoarrone(int *arr1, int *arr3, int *arr4, int cnts, int cntd) {
int i;
for (i = 0; i < cnts; i++) {
arr1[i] = arr3[i];
}
for (i = 0; i < cntd; i++) {
arr1[i+cnts] = arr4[i];
}
}
void Getarrfour(int *arr1, int *arr2, int *arr4, int arr1Size, int arr2Size, int *cntd) {
int i, j;
int temp;
int flag;
for (i = 0; i < arr1Size; i++) {
temp = arr1[i];
flag = 0;
for (j = 0; j < arr2Size; j++) {
if (arr2[j] == temp) {
flag = 1;
break;
}
}
if (flag == 0) {
arr4[(*cntd)++] = temp;
}
}
}
int* relativeSortArray(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize)
{
int i, j;
int *arr3;
int *arr4;
int cnts = 0;
int cntd = 0;
int temp;
arr3 = (int *)malloc(sizeof(int) * arr1Size);
arr4 = (int *)malloc(sizeof(int) * arr1Size);
memset(arr3, 0, sizeof(int) * arr1Size);
memset(arr4, 0, sizeof(int) * arr1Size);
for (i = 0; i < arr2Size; i++) {
temp = arr2[i];
for (j = 0; j < arr1Size; j++) {
if (arr1[j] == temp) {
arr3[cnts++] = temp;
}
}
}
Getarrfour(arr1, arr2, arr4, arr1Size, arr2Size, &cntd);
qsort(arr4, cntd, sizeof(int), Comp);
Copytoarrone(arr1, arr3, arr4, cnts, cntd);
*returnSize = arr1Size;
return arr1;
}