题目描述:
给你两个数组,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数组中依次取出每一个元素,寻找其在arr1中对应出现的次数,之后存入输出数组中,最后对于arr1中出现但arr2中没有的元素,依照升序存入。
代码实现
本题我利用了计数排序的思想,相关参考资料如下
什么是计数排序
步骤:
1、遍历arr1,更新res[]
2、遍历arr2,依次获取arr2中每一个元素的值和其在arr1中的出现次数,并存入输出数组ans[],并将其在res[]中的值致零。
3、遍历res[],对剩余res[]不为0的元素存入输出数组。
具体代码如下所示:
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int []ans=new int[arr1.length];// res[]:res[]下标表示arr1中元素值,res[]值表示该值在arr1中出现的次数
int res[]=new int[1001];//ans[]:输出数组
int i2,j=0,t=0;
int i1=0,k=0;
for(i1=0;i1<arr1.length;i1++)
{
res[arr1[i1]]++;
}
for(i2=0;i2<arr2.length;i2++)
{
k=res[arr2[i2]];
for(j=0;j<k;j++)
{
ans[t++]=arr2[i2];
}
res[arr2[i2]]=0;
}
for(i1=0;i1<res.length;i1++)
{
k=res[i1];
if(k!=0)
{
for(j=0;j<k;j++)
{
ans[t++]=i1;
}
}
}
return ans;
}
运行调试
在第一次提交时,我忽视了问题的提示条件,误写为int res[]=new int[1000];从而导致了数组越界。因限定条件有0 <= arr1[i], arr2[i] <= 1000。所以res下标最大值应为1000,故res数组长度应设为1001。
运行结果