React.Suspense是什么
Suspense 是用来做什么的?suspense 的字面意思就是悬而不决,用在平时开发中,就可以理解为还没有完成的事,你不知道啥时候完成。也就是异步,异步加载组件,异步请求数据。
1. 代码拆分服务于打包优化的代码拆分。lazy和suspense配合使用
1234567const A = React.lazy(() => import('./A'))return ( <Suspense fallback={<p>loading</p>}> <Route component={A} path="/a"> </Suspense>)
这样在打包代码时,可以显著减少主包的体积,加快加载速度,从而提升用户体验;而当路由切换时,加载新的组件代码,代码加载是异步的过程,此时 suspense 就会进如 fallback,那我们看到的就是 loading,显式的告诉用户正在加载,当代码加载完成就会展示 A 组件的内容,整个 loading 状态 ...
合并两个有序数组
合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 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 中的元素。
输入:nums1 = [1], m = 1, nums2 = [], n = 0输出:[1]解释:需要合并 [1] 和 [] 。合并结果是 [1] 。
1234567891011121314var merge = function( ...
对操作系统的理解?核心概念有哪些?
对操作系统的理解?核心概念有哪些?一、是什么
操作系统(Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序,同时也是计算机系统的内核与基石简单来讲,操作系统就是一种复杂的软件,相当于软件管家操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务,操作系统的类型非常多样,不同机器安装的操作系统可从简单到复杂,可从移动电话的嵌入式系统到超级电脑的大型操作系统,在计算机与用户之间起接口的作用,如图
二、核心概念
操作系统的核心概念都是对具体物理硬件的抽象,主要有如下:
进程(线程):进程(线程)是操作系统对 CPU 的抽象
虚拟内存(地址空间):虚拟内存是操作系统对物理内存的抽象
文件:文件是操作系统对物理磁盘的抽象
shell:它是一个程序,可从键盘获取命令并将其提供给操作系统以执行。
GUI :是一种用户界面,允许用户通过图形图标和音频指示符与电子设备进行交互
计算机架构(computer architecture) ...
统计字符串中的元音子字符串
统计字符串中的元音子字符串
子字符串 是字符串中的一个连续(非空)的字符序列。元音子字符串 是 仅 由元音(’a’、’e’、’i’、’o’ 和 ‘u’)组成的一个子字符串,且必须包含 全部五种 元音。给你一个字符串 word ,统计并返回 word 中 元音子字符串的数目 。
输入:word = “aeiouu”输出:2解释:下面列出 word 中的元音子字符串(斜体加粗部分): -aeiouu
aeiouu
输入:word = “unicornarihan”输出:0解释:word 中不含 5 种元音,所以也不会存在元音子字符串。
1234567891011121314151617181920212223242526272829303132333435var countVowelSubstrings = function(word) { let str = 'aeiou'; let tmp = ''; let deo = []; for (let i = 0, n = word.length; i < n; i ...
数组中第 K 个独一无二的字符串
数组中第 K 个独一无二的字符串
独一无二的字符串 指的是在一个数组中只出现过 一次 的字符串。给你一个字符串数组 arr 和一个整数 k ,请你返回 arr 中第 k 个 独一无二的字符串 。如果 少于 k 个独一无二的字符串,那么返回 空字符串 “” 。注意,按照字符串在原数组中的 顺序 找到第 k 个独一无二字符串。
输入:arr = [“d”,”b”,”c”,”b”,”c”,”a”], k = 2输出:”a”解释:arr 中独一无二字符串包括 “d” 和 “a” 。“d” 首先出现,所以它是第 1 个独一无二字符串。“a” 第二个出现,所以它是 2 个独一无二字符串。由于 k == 2 ,返回 “a” 。
输入:arr = [“aaa”,”aa”,”a”], k = 1输出:”aaa”解释:arr 中所有字符串都是独一无二的,所以返回第 1 个字符串 “aaa” 。
123456789101112131415var kthDistinct = function(arr, k) { // 创建Map const map = new Map(); ...
最大间距
最大间距
给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。
输入: nums = [3,6,9,1]输出: 3解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
输入: nums = [10]输出: 0解释: 数组元素个数小于 2,因此返回 0。
12345var maximumGap = function(nums, maxNum = 0) { if(nums.length < 2) return 0 nums.sort((a, b) => a - b).reduce((pre, val) => ((val - pre) > maxNum && (maxNum = (val - pre)),val)) return maxNum};
全排列 II
全排列 II
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
输入:nums = [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]
输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
1234567891011121314151617181920212223242526272829var permuteUnique = function(nums) { const res = []; const used = new Array(nums.length); nums.sort((a, b) => a - b); // 升序排序 const helper = (path) => { if (path.length == nums.length) { // 个数选够了 res.push(path.slice()); // pat ...
环形子数组的最大和
环形子数组的最大和
给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i + 1], …, nums[j] ,不存在 i <= k1, k2 <= j 其中 k1 % n == k2 % n 。
输入:nums = [1,-2,3,-2]输出:3解释:从子数组 [3] 得到最大和 3
输入:nums = [5,-3,5]输出:10解释:从子数组 [5,5] 得到最大和 5 + 5 = 10
12345678910111213141516var maxSubarraySumCircular = function(nums) { const sum = nums.reduce((a,b)=> ...
子数组的最小值之和
子数组的最小值之和
给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。由于答案可能很大,因此 返回答案模 10^9 + 7 。
输入:arr = [3,1,2,4]输出:17解释:子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。最小值为 3,1,2,4,1,1,2,1,1,1,和为 17。
输入:arr = [11,81,94,43,3]输出:444
1234567891011121314151617var sumSubarrayMins = function(arr) { let ans = 0; let len = arr.length; let stack = [len]; let every = 0; for(let i=len-1;i>=0;i--){ while(stack.length && arr[stack[stack.length-1]] ...
零钱兑换
零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。
输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1
输入:coins = [2], amount = 3输出:-1
12345678910111213141516var coinChange = function(coins, amount) { // 初始化一个dp数组,为了方便初始化为Infinity,其实大于amount的都行吧 let dp = new Array(amount + 1).fill(Infinity); dp[0] = 0; // 面额为0的需要0个硬币兑换 for(let i = 1; i <= amount; i++) { // 循环面额 for(let coin of coins) { // 循环硬币数组 ...