下面为两个有序数组变成一个有序数组(不使用sort) codes
。
写法一(若一看不太明白,可以下翻看二)
// 思路:从后向前依次循环数组的总长度,如果fakeSSR的最后一位 < fakeSSE的最后一位
// 就再新数组中添加fakeSSE最后一位 并且 fakeSSE的长度-1拿到最新的最后一位数据继续比较
// 反之 添加fakeSSR最后一位 并且 fakeSSR的长度-1拿到最新的最后一位数据继续比较
// 不理解的可以直接复制到vscode里断点调试看一下就明白了
let fakeSSR = [1,3,5,6,7,13,14,15,16,23,43]
let fakeSSE = [3,4,6,9,13,17,19,20,21]
function solution (num1, num2) {
// 数组1的长度
let m = num1.length;
// 数组2的长度
let n = num2.length;
// 数组1的最后一位的下表
let p1 = m - 1;
// 数组2的最后一位的下表
let p2 = n - 1;
// 新数组的最后一位的下表
let p = m + n - 1;
// 循环遍历 递减
// 当数组1 和 数组2的长度都大于0则循环
// 如果需要覆盖fakeSSR数组则条件更改为
// p1 >= 0 && p2 >= 0
// 如果需要赋值到新数组则条件为
// p1 >= 0 && p2 >= n-m
while (p1 >= 0 && p2 >= 0) {
// 数组1的最后一位 =
// 数组1的最后一位 < 数组2的最后一位就
// 如果需要覆盖fakeSSR数组则赋值对象变更为
// fakeSSr[p--] = (num1[p1] < num2[p2] ? num2[p2--] : num1[p1--])
fakeSSR[p--] = (num1[p1] < num2[p2] ? num2[p2--] : num1[p1--])
}
return fakeSSR
}
console.log(solution(fakeSSR,fakeSSE));
/**
[
1, 3, 3, 4, 5, 6, 6,
7, 9, 13, 13, 14, 15, 16,
17, 19, 20, 21, 23, 43
]
*/
thank u for coming~
写法二
let ad = [1,3,5,6,7,13,14,15,16,20,33]
let ap = [3,4,6,8,9,13,17,18,19]
// 合并后的数组有序
let between = []
const transForNew = (ad,ap) => {
// 直接循环次数为两个数组的总长度
while(ad.length + ap.length > 0){
// 如果 其中有一个数组里的数字被添加到新数组添加完了 就是 length < 1
if(ad.length < 1 || ap.length < 1){
// 则把剩余的那个数组合并到between中
between = between.concat(ad.length < 1 ? ap : ad)
break
}
// 没有空数组则判断
// 分别拿出两个数组中的第一位作比较
// for example ad的第一个数 比 ap的第一个数大 则把ap的这个小数添加到新数组between中
// 然后把这个小数在原数组中删除,再拿ad的这个大的数字和ap的下一个作比较
// 依此类推 反之亦是如此
between.push(ad[0] >= ap[0] ? ap.shift() : ad.shift())
}
return between
}
console.log(transForNew(ad,ap));
/**
[
1, 3, 3, 4, 5, 6, 6,
7, 8, 9, 13, 13, 14, 15,
16, 17, 18, 19, 20, 33
]
*/
thank u for coming~