跟我一起每周打卡[11期]:AART计划

96 阅读2分钟

一枚努力学习前端的程序媛,之前都在自己的博客: Study Of Toast (breadfruit.github.io)(国内站点) 上打卡,现在是到了第11期了,每周阅读刷刷

Algorithm:

114. 二叉树展开为链表

解题思路:

可以发现展开的顺序其实就是二叉树的先序遍历。

  1. 将左子树插入到右子树的地方
  2. 将原来的右子树接到左子树的最右边节点
  3. 考虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 null

还有一种是利用了前序遍历,将树节点依次放入数组,然后再利用数组组成链表。

1208. 尽可能使字符串相等

前缀和 + 二分查找

利用前缀和记录两个字符串到第i个位置所消费的总开销。利用 前缀和 - 第i个节点中间的开销小于等于预算。

accDiff[i] - accDiff[start] <= maxCost
​
accDiff[i] - maxCost <= accDiff[start]

根据等式,在start - i 中找到 accDiff[i] - maxCost 的最大值。并返回start。

function equalSubstring(s: string, t: string, maxCost: number): number {
    const n = s.length;
    // 记录前缀和
    const  accDiff = new Array(n + 1).fill(0)
    for(let i = 0; i < n; i++) {
        accDiff[i+1] = accDiff[i] + Math.abs(s[i].charCodeAt(0)- t[i].charCodeAt(0));
    }
    let maxLength = 0;
    for(let j = 1; j < accDiff.length; j++) {
        const start = binarySearch(accDiff, j, accDiff[j] - maxCost)
        maxLength = Math.max(maxLength, j - start)
    }
    return maxLength
};
function binarySearch (accDiff: number[], endIndex: number, target: number): number {
    let low = 0;
    let high = endIndex;
    while(low < high) {
        let mid = Math.floor((low + high) / 2)
        if(accDiff[mid] < target) {
            low = mid + 1
        }else {
            high = mid
        }
    }
    return low;
​
}

Review:使用 TypeScript 从字符串文字类型中提取参数类型

主要介绍了ts4.1的Template Literal TypesConditional TypeConditional Type

Template Literal Types在开发中主要用于枚举常量。Conditional Type主要应用于不同场景下的ts类型。

最后react router 中对于route的path,params也是利用这个两个ts类型实现。

// 提取参数类型
// type IsParameter<Part> = Part extends `[${infer ParamName}]` ? Part : never
// 去除[]
type IsParameter<Part> = Part extends `[${infer ParamName}]` ? ParamName : never
// 进行condition type判断 利用递归将多个参数类型进行提取
type FilteredParts<Path> = Path extends `${infer PartA}/${infer PartB}` ?  IsParameter<PartA> | FilteredParts<PartB> : IsParameter<Path>
// 将path类型映射成对象
// type Params<Path> = {
//   [key in FilteredParts<Path>]: any
// }
// 将condition type区分参数类型
type ParamValue<Key> = Key extends `...${infer Anything}` ? string[] : number;
// type Params<Path> = {
//   [Key in FilteredParts<Path>]: ParamValue<Key>
// }
type RemovePrefixDots<Key> = Key extends `...${infer Name}` ? Name : Key
type Params<Path> = {
  [Key in FilteredParts<Path> as RemovePrefixDots<Key>]: ParamValue<Key>
}
type Path = Params<'/purchase/[shopid]/[itemid]/args/[...args]'>

Tips:css-browser-support

使用 caniuse.com 和 MDN 查询 CSS 浏览器支持情况 — 传递字符串或者字符串数组作为参数进行查询,返回不同浏览器支持的结果

可以对css样式的浏览器兼容进行查看并对其添加其他css特性。

在React-Router中使用动画

用的库是react官方推荐的 React Transition Group

cssTransition 的属性 key需要配合react-route-dom的useLocation,但是出现下面的报错

React js: Error: useLocation() may be used only in the context of a <Router> component

解决方案

使用useLocation()需要在的全局上下文context使用,所以需要在根组件外面添加,才能在中使用useLocation()。