您好,我被问了以下问题。
给定两个数组,即array1和array2。它们都按排序顺序包含数字。
Array1还包含-1,例如;在array1中有多少个数字,在array2中就有多少个-1。
例如如下所示:
array1 = [-1,-1,-1,-1,56,78,90,1200];
array2 = [1,4,5,1000]
我需要编写一个程序,将上述数组合并为一个数组,该新数组按照排序顺序包含两个数组中的数字,但不包括 -1。
以下是我的代码:
puzzle04([3,6,-1,11,15,-1,23,34,-1,42],[1,12,28]);
puzzle04([3,6,-1,11,15,-1,23,34,-1,42],[7,19,38]);
puzzle04([3,6,11,15,32,34,42,-1,-1,-1,-1],[1,10,17,56]);
puzzle04([-1,-1,-1,-1,3,6,11,15,32,34,42],[1,10,17,56]);
puzzle04([-1,-1,-1,-1,3,6,11,15,32,34,42],[56,78,90,100]);
puzzle04([12,34,65,-1,71,85,90,-1,101,120,-1,200],[24,37,94]);
puzzle04([3,6,-1,11,15,-1,32,34,-1,42,-1],[1,10,17,56]);
puzzle04([-1,-1,-1,56,78,90,112],[1,4,5]);
puzzle04([-1,-1,-1,-1,56,78,90,112],[1,4,5,1000]);
puzzle04([-1,-1,-1,-1,56,78,90,1200],[1,4,5,1000]);
function puzzle04(array1,array2){
var outputArray = [],
array1Counter = 0, // counter for array1
array2Counter = 0, // counter for array2
isArray2NumPlaced = false, // has number from array2 found its position in output array ?
areAllArray2NumsFilled = false; // is number pushed in output array
// iterating through array2 loop
for(array2Counter = 0; array2Counter < array2.length; array2Counter++){
// iterating through array1 loop
for(; (isArray2NumPlaced === false); array1Counter++){
// -1 encountered in array1
if(array1[array1Counter] === -1){
continue;
// if array1 number is less than array2 number
// then push array1 number in ouput array
}else if(array1[array1Counter] < array2[array2Counter]){
outputArray.push(array1[array1Counter]);
}else{ // array2 number is less then array1 number
// add array2 number in output array until
// all array2 numbers are not added in output array.
if(areAllArray2NumsFilled === false){
outputArray.push(array2[array2Counter]);
}
// is array2 number pushed in output array ?
isArray2NumPlaced = true;
}// end of if-else
// if all the array2 numbers are added in output array
// but still array1 numbers are left to be added
if(isArray2NumPlaced === true
&& array2Counter === (array2.length - 1)
&& array1Counter <= (array1.length - 1)){
outputArray.push(array1[array1Counter]);
// set the below flag to false so that,
// array1 loop can iterate
isArray2NumPlaced = false;
// all the numbers of array2 are entered in output array
areAllArray2NumsFilled = true;
}// end of if
}// array1 for-loops ends
array1Counter--;
isArray2NumPlaced = false;
}// array2 for-loops ends
console.log("final ",outputArray);
}
以上代码的输出如下:
final [ 1, 3, 6, 11, 12, 15, 23, 28, 34, 42 ]
final [ 3, 6, 7, 11, 15, 19, 23, 34, 38, 42 ]
final [ 1, 3, 6, 10, 11, 15, 17, 32, 34, 42, 56 ]
final [ 1, 3, 6, 10, 11, 15, 17, 32, 34, 42, 56 ]
final [ 3, 6, 11, 15, 32, 34, 42, 56, 78, 90, 100 ]
final [ 12, 24, 34, 37, 65, 71, 85, 90, 94, 101, 120, 200 ]
final [ 1, 3, 6, 10, 11, 15, 17, 32, 34, 42, 56 ]
final [ 1, 4, 5, 56, 78, 90, 112 ]
final [ 1, 4, 5, 56, 78, 90, 112, 1000 ]
final [ 1, 4, 5, 56, 78, 90, 1000, 1200 ]
当我向代码评审者展示我的代码时,他说我使用了太多的布尔变量,代码可以更简单。
我尽力改进了,但是没有任何线索。
您能否请建议我解决上述问题的更好方法?
注:不能使用任何现成的排序方法或预写API来解决以上练习。
O(nm * log(nm))
的时间复杂度,这并不是太糟糕。 - Sean Kwon