, Это очень просто сделать следующим образом.
ом из интервью мне был задан следующий вопрос. Мне дают два массива, оба они отсортированы.
НО
Массив 1 будет иметь несколько -1, а массив 2 будет иметь общее число как общее число -1 в массиве 1.
Таким образом, в приведенном ниже примере массив1 имеет три -1, следовательно, массив2 имеет 3 числа.
скажи
var arrayOne = [3,6,-1,11,15,-1,23,34,-1,42];
var arrayTwo = [1,9,28];
Оба массива будут отсортированы.
Теперь я должен написать программу, которая объединит arrayTwo в arrayOne, заменив -1, и arrayOne должен быть в отсортированном порядке.
Таким образом, выход будет
arrayOne = [ 1,3, 6, 9, 11, 15, 23, 28 ,34, 42 ]
Сортировка должна выполняться без использования какого-либо API-интерфейса.
Я написал следующий код
function puzzle01() {
var arrayOne = [3, 6, -1, 11, 15, -1, 23, 34, -1, 42];
var arrayTwo = [1, 9, 28];
var array1Counter = 0,
isMerged = false;
console.log(" array-1 ", arrayOne);
console.log(" array-2 ", arrayTwo);
for (var array2Counter = 0; array2Counter < arrayTwo.length; array2Counter++) {
isMerged = false;
while (isMerged === false && array1Counter < arrayOne.length) {
if (arrayOne[array1Counter] === -1) {
arrayOne[array1Counter] = arrayTwo[array2Counter];
isMerged = true;
}
array1Counter++;
}
} //for
console.log(" array-1 + array-2 ", arrayOne);
bubbleSort(arrayOne);
console.log(" Sorted array ", arrayOne);
} //puzzle01
puzzle01();
// implementation of bubble sort for sorting the
// merged array
function bubbleSort(arrayOne) {
var nextPointer = 0,
temp = 0,
hasSwapped = false;
do {
hasSwapped = false;
for (var x = 0; x < arrayOne.length; x++) {
nextPointer = x + 1;
if (nextPointer < arrayOne.length && arrayOne[x] > arrayOne[nextPointer]) {
temp = arrayOne[x];
arrayOne[x] = arrayOne[nextPointer];
arrayOne[nextPointer] = temp;
hasSwapped = true;
}
} //for
} while (hasSwapped === true);
} // bubbleSort
Вывод вышеуказанного кода
array-1 [ 3, 6, -1, 11, 15, -1, 23, 34, -1, 42 ]
array-2 [ 1, 9, 28 ]
array-1 + array-2 [ 3, 6, 1, 11, 15, 9, 23, 34, 28, 42 ]
Sorted array [ 1, 3, 6, 9, 11, 15, 23, 28, 34, 42 ]
Как видно из приведенного выше кода, я сначала объединил два массива, а затем отсортировал последний.
Просто хотел узнать, есть ли лучшее решение.
Есть ли недостаток в моем решении.
Пожалуйста, дайте мне знать, это будет полезно.
Прочитав все ваши очень полезные комментарии и ответы, я обнаружил, что смог найти более быстрое решение.
Давайте возьмем пример
var arrayOne = [3,6,-1,11,15,-1,32,34,-1,42,-1];
var arrayTwo = [1,10,17,56],
Шаг 1: я буду перебирать arrayTwo. Возьмите следующий элемент (то есть «1») и сравните со следующим элементом arrayOne (то есть «3») и сравните.
Шаг 2а: Если элемент массива1 больше, чем элемент массива2, чем элементы массива подкачки. Теперь перейдите к следующему элементу array1.
ИЛИ ЖЕ
Шаг 2b: Если элемент массива1 равен -1, чем элементы массива подкачки. Теперь перейдите к следующему элементу array2.
Шаг 3: перейдите к шагу 1.
Так
в приведенном выше примере
первая итерация, array1 = [1,6, -1,11, ...] array2 = [3,10,17,56]
вторая итерация, array1 = [1,3, -1,11, ..] array2 = [6,10,17,56]
третья итерация, массив1 = [1,3,6,11 ..] массив2 = [-1,10,17,56]
массив четвертой итерации1 = [1,3,6,10, ..] массив2 = [-1,11,17,56]
и так далее.
в конце я получу вывод
array1 = [ 1, 3, 6, 10, 11, 15, 17, 32, 34, 42, 56 ]
array2 = [-1,-1,-1]
Пожалуйста, найдите код ниже,
function puzzle02(arrayOne,arrayTwo){
var array1Counter = 0,
array2Counter = 0,
hasMinusOneOccurred = false;
console.log(" array-1 ",arrayOne);
console.log(" array-2 ",arrayTwo);
while(array2Counter < arrayTwo.length){ // iterate through array2
do{
if(arrayOne[array1Counter] === -1){ // if -1 occurred in array1
hasMinusOneOccurred = true;
// swaping numbers at current position of array1
// with current position of array2
swap(arrayOne,arrayTwo,array1Counter,array2Counter);
// recheck if the current value is greater than other values
// of array1
if(recheckAndSort(arrayOne,array1Counter) === true){
array1Counter = -1;// recheck array1 from start
}else{
// recheck the current array1 counter, for doing so go 1 count back
// so that even if the counter is incremented it points to current
// number itself
array1Counter--;
}
}else if(arrayOne[array1Counter] > arrayTwo[array2Counter]){
swap(arrayOne,arrayTwo,array1Counter,array2Counter);
}else{
array1Counter++;
continue;
}
array1Counter++;
}while(hasMinusOneOccurred === false); // end of do-while
array2Counter++;
hasMinusOneOccurred = false;
}//end of while
console.log(" Sorted array ",arrayOne);
function swap(arr1,arr2,arr1Index,arr2Index){
var temp = arr2[arr2Index];
arr2[arr2Index] = arr1[arr1Index];
arr1[arr1Index] = temp;
}// end of swap
// this method is call if -1 occures in array1
function recheckAndSort(arrayOne,array1Counter){
var isGreaterVal = true,
prevCounter = 0,
nextCounter = 0,
temp = 0,
recheckFromStart = false;
if(array1Counter === 0){ // if -1 occurred at first position of array1.
// flag to check if -1 occurrec at first position
// if yes, iterate array1 from start
recheckFromStart = true;
// iterate forward to check wether any numbers are less than current position,
// if yes than move forward
for(var j = 0; isGreaterVal; j++){
nextCounter = j + 1;
if(arrayOne[nextCounter] === -1){
// swaping numbers of array1 between next to current
swap(arrayOne,arrayOne,nextCounter,j);
isGreaterVal = true;
}else if(arrayOne[nextCounter] < arrayOne[j]){
// swaping numbers of array1 between next to current
swap(arrayOne,arrayOne,nextCounter,j);
isGreaterVal = true;
}else{
isGreaterVal = false;
}
}//end of for
}else{// if -1 occurred in the middle position of array1 and is been swaped then
// iterate backwards to check if any number less then current position exists,
// if yes than shift backwards.
for(var i = array1Counter; isGreaterVal; i--){
prevCounter = i - 1;
if(arrayOne[prevCounter] > arrayOne[i]){
// swaping numbers of array1 between previous to current
swap(arrayOne,arrayOne,prevCounter,i);
isGreaterVal = true;
}else{
isGreaterVal = false;
}
}// end of for
}
return recheckFromStart;
}// end of recheckAndSort
} // end of puzzle02
После вызова вышеуказанной функции
puzzle02([3,6,-1,11,15,-1,32,34,-1,42,-1],[1,10,17,56]);
Вывод вышеуказанного кода:
array-1 [ 3, 6, -1, 11, 15, -1, 32, 34, -1, 42, -1 ]
array-2 [ 1, 10, 17, 56 ]
Sorted array [ 1, 3, 6, 10, 11, 15, 17, 32, 34, 42, 56 ]
Благодарю.