Javascript 合并两个数组并对最后一个数组进行排序
在一次采访中,我被问到以下问题。 我得到了两个数组,它们都已排序 但是 数组1将有几个-1,数组2将有总数作为数组1中-1的总数 在下面的例子中 array1有三个-1,因此array2有三个数字 比方说Javascript 合并两个数组并对最后一个数组进行排序,javascript,arrays,algorithm,sorting,Javascript,Arrays,Algorithm,Sorting,在一次采访中,我被问到以下问题。 我得到了两个数组,它们都已排序 但是 数组1将有几个-1,数组2将有总数作为数组1中-1的总数 在下面的例子中 array1有三个-1,因此array2有三个数字 比方说 var arrayOne = [3,6,-1,11,15,-1,23,34,-1,42]; var arrayTwo = [1,9,28]; 这两个数组都将被排序 现在我必须编写一个程序,通过替换-1将arrayTwo合并到arrayOne中,arrayOne应该按顺序排序 因此,输出将是
var arrayOne = [3,6,-1,11,15,-1,23,34,-1,42];
var arrayTwo = [1,9,28];
这两个数组都将被排序
现在我必须编写一个程序,通过替换-1将arrayTwo合并到arrayOne中,arrayOne应该按顺序排序
因此,输出将是
arrayOne = [ 1,3, 6, 9, 11, 15, 23, 28 ,34, 42 ]
排序应在不使用任何排序API的情况下完成
我已经编写了以下代码
函数拼图01(){
var arrayOne=[3,6,-1,11,15,-1,23,34,-1,42];
var arrayTwo=[1,9,28];
var Array1计数器=0,
isMerged=false;
console.log(“array-1”,arrayOne);
console.log(“array-2”,arrayTwo);
对于(var array2Counter=0;array2CounterarrayOne[nextPointer]){
温度=阵列长度[x];
arrayOne[x]=arrayOne[nextPointer];
arrayOne[nextPointer]=临时;
hasSwapped=true;
}
}//为了
}while(hasSwapped==true);
}//bubbleSort
您可以在单个循环中迭代数组一个
,然后在数组两个
3, 6, --, 11, 15, --, 23, 34, --, 42
1, 9, 28
其思想是将目标索引与实际索引分开。第一个循环忽略-1
,并保留目标索引
如果实际值大于arrayTwo
的第一个值,则交换的值和arrayTwo中的值都将通过迭代和与更大的值交换进行排序
然后将实际项目分配给目标索引
两个索引都会递增
最后,将arrayTwo
的所有项添加到arrayOne
函数顺序(arrayOne,arrayTwo){
变量i=0,j,l=0;
while(iarrayTwo[j+1]){
[arrayTwo[j],arrayTwo[j+1]]=[arrayTwo[j+1],arrayTwo[j]];
j++;
}
}
arrayOne[l++]=arrayOne[i++];
}
j=0;
while(l
。作为控制台包装{max height:100%!important;top:0;}
您应该执行类似于插入排序的操作。由于两个数组都已排序(除-1s外),array2
中的最小数字将放在第一个元素和第一个-1之间的某个位置,array2
的第二个元素将放在array1
中的第一个-1之后的任何位置,以及array1
中的第二个-1之前或之前,依此类推
因此,您必须仅在array1
的一段而不是整个数组中插入array2
的特定元素。此外,<>代码> ARARY2中的每个元素都必须考虑<代码> > ARARY1不同的段或子数组。因此,此逻辑的有效时间复杂度将是O(n+m)
,其中n
是array1
的长度,m
是array2
的长度。您应该使用merge函数from,并对其进行修改,使其不创建新数组,而是使用array1,并执行转换,从array2中插入一个元素后,这将使元素向右移动,直到下一个-1,从而覆盖-1。难道不是这样吗
将ArrayTo的每个项目与arrayOne的每个项目进行比较
如果比arrayOne大,则插入该项,并在迭代arrayOne时删除所有-1。
功能合并(a1、a2){
var i=0;
var j=0;
而(ia2[j]){
//交换值
var-temp=a2[j];
a2[j]=a1[i];
a1[i]=温度;
i++;
}否则,如果(a1[i]!==-1&&a1[i]您可以尝试以下方法:
逻辑
- 创建将返回的新数组
- 检查
数组two
中的第一个元素,并将其保存在变量中,例如val
- 在
数组上循环一个
并检查当前值是否大于val
,将其推入数组并将i
的值递减1,以检查下一个值以及当前元素
- 现在检查当前元素。如果它小于
0
,则忽略它,否则将值推送到数组
- 返回此数组
函数mergeAndSort(a1、a2){
var-matchCount=0;
var-ret=[];
对于(变量i=0;ival){
返回推送(val)
匹配计数++
我--;
继续;
}
如果(a1[i]>0
3, 6, --, 11, 15, --, 23, 34, --, 42
3, 6, --, 11, 15, --, 23, --, 34, 42
3, 6, --, 11, 15, --, --, 23, 34, 42
3, 6, --, 11, --, --, 15, 23, 34, 42
3, 6, --, --, --, 11, 15, 23, 34, 42
3, --, --, --, 6, 11, 15, 23, 34, 42
--, --, --, 3, 6, 11, 15, 23, 34, 42
--, --, --, 3, 6, 11, 15, 23, 34, 42
1, 9, 28
1, --, --, 3, 6, 11, 15, 23, 34, 42
--, 9, 28
1, 3, --, --, 6, 11, 15, 23, 34, 42
--, 9, 28
1, 3, 6, --, --, 11, 15, 23, 34, 42
--, 9, 28
1, 3, 6, 9, --, 11, 15, 23, 34, 42
--, --, 28
1, 3, 6, 9, 11, --, 15, 23, 34, 42
--, --, 28
1, 3, 6, 9, 11, 15, --, 23, 34, 42
--, --, 28
1, 3, 6, 9, 11, 15, 23, --, 34, 42
--, --, 28
1, 3, 6, 9, 11, 15, 23, 28, 34, 42
--, --, --
public static void AMerge()
{
int[] array1 = new int[] { 3, 6, -1, 11, 15, -1, 23, 34, -1, 42 };
int[] array2 = new int[] { 1, 9, 28 };
int[] arrayMerged = new int[array1.Length];
int array1Index = 0;
int array2Index = 0;
for (int arrayMergedIndex = 0; arrayMergedIndex < array1.Length; arrayMergedIndex++)
{
while (array1[array1Index] == -1) array1Index++; //ignore -1 placeholders
if ((array1Index < array1.Length && array2Index >= array2.Length)
|| array1[array1Index] <= array2[array2Index]) //choose which array will provide current merged value
{
arrayMerged[arrayMergedIndex] = array1[array1Index];
array1Index++;
}
else
{
arrayMerged[arrayMergedIndex] = array2[array2Index];
array2Index++;
}
}
char[] charsToTrim = { ',', ' '};
string arrayMergedString = "{";
foreach (int f in arrayMerged) arrayMergedString += f.ToString() + " ";
arrayMergedString = arrayMergedString.TrimEnd(charsToTrim) + "}";
Console.WriteLine(arrayMergedString);
Console.ReadKey();
}
}