1、Algorithm 一道算法题
给你两个按 非递减顺序 排列的整数数组
nums1**和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你 合并
nums2**到nums1中,使合并后的数组同样按 非递减顺序 排列。注意: 最终,合并后数组不应由函数返回,而是存储在数组
nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。
输入: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
解释: 需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
由于两个数组都已经进行了排序,因此可以用双指针的方法解决。两个指针分别指向两个数组中的元素。 迭代2个指针,比较2个指针的值,每次把两个指针中较小的值放入新的数组。 最后把排好序的数组的值复制到原来的数组中,以满足题目中nums2的原地返回。
/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
var merge = function(nums1, m, nums2, n) {
const tmp = new Array(m+n);
let p1=0,p2=0;
while(p1<m || p2 < n){
let pMin = null;
if(p1 === m){
pMin=nums2[p2++];
} else if(p2 ===n){
pMin = nums1[p1++];
} else{
pMin = nums1[p1] < nums2[p2] ? nums1[p1++] : nums2[p2++];
}
tmp[p1+p2-1]=pMin;
}
for(let i=0;i<m+n;i++){
nums1[i] = tmp[i];
}
return nums1;
};
2、Review 读一篇英文文章
阿里云的 hooks 库的使用文档和源码:ahooks,该文档有中文,优先阅读了英文版本。
记录几个hooks的实现:
useLockFn
● 返回一个函数,函数中引用了一个 ref 闭包变量。当闭包变量为true时,不允许执行函数。否则先设置闭包变量为true,然后异步调用函数,这里函数为一个 Promise,等函数 resolve 以后,设置 ref 闭包变量为 false。在 ref 为 true 时,如果有其他对该函数的调用,则不允许执行。
useUpdate
● 通过 setState 设置一个空对象来强制组件的重新渲染。
useCallback(() => setState({}), []);
这行代码使用 useCallback 钩子返回一个回调函数。这个回调函数会在每次组件重新渲染时保持稳定,因为它的依赖项数组为空数组。回调函数的作用是在调用时通过更新空对象的状态来触发组件的重新渲染。通过调用setState({}),我们传递一个新的空对象作为状态的更新值,即使状态值没有实际改变,也会触发组件的重新渲染。
useEventEmitter
在多个组件之间进行事件通知有时会让人非常头疼,借助 EventEmitter ,可以让这一过程变得更加简单。
const focus$ = useEventEmitter();
return (
<>
<MessageBox focus$={focus$} />
<InputBox focus$={focus$} />
</>
);
使用 useEventEmitter 设置一个事件中心实例,该实例具有emit和useSubscription 2种方法。emit 用于分发事件,useSubscription 用于订阅事件。
event$.emit('hello');
event$.useSubscription(val => {
console.log(val);
});
3、Technique/Tips 分享一个小技术
前端可以考虑使用 Go 进行 BFF 的开发。
4、Share 分享一个观点
种一棵树最好的时间是十年前,其次是现在。