得到 K 个黑块的最少涂色次数
得到 K 个黑块的最少涂色次数
给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 ‘W’ 要么是 ‘B’ ,表示第 i 块的颜色。字符 ‘W’ 和 ‘B’ 分别表示白色和黑色。给你一个整数 k ,表示想要 连续 黑色块的数目。每一次操作中,你可以选择一个白色块将它 涂成 黑色块。请你返回至少出现 一次 连续 k 个黑色块的 最少 操作次数。
输入:blocks = “WBBWWBBWBW”, k = 7输出:3解释:一种得到 7 个连续黑色块的方法是把第 0 ,3 和 4 个块涂成黑色。得到 blocks = “BBBBBBBWBW” 。可以证明无法用少于 3 次操作得到 7 个连续的黑块。所以我们返回 3 。
输入:blocks = “WBWBBBW”, k = 2输出:0解释:不需要任何操作,因为已经有 2 个连续的黑块。所以我们返回 0 。
12345678910111213var minimumRecolors = function(blocks, k) { let left = 0, right = 0, mi ...
第一个出现两次的字母
第一个出现两次的字母
给你一个由小写英文字母组成的字符串 s ,请你找出并返回第一个出现 两次 的字母。注意:如果 a 的 第二次 出现比 b 的 第二次 出现在字符串中的位置更靠前,则认为字母 a 在字母 b 之前出现两次。s 包含至少一个出现两次的字母。
输入:s = “abccbaacz”输出:”c”解释:字母 ‘a’ 在下标 0 、5 和 6 处出现。字母 ‘b’ 在下标 1 和 4 处出现。字母 ‘c’ 在下标 2 、3 和 7 处出现。字母 ‘z’ 在下标 8 处出现。字母 ‘c’ 是第一个出现两次的字母,因为在所有字母中,’c’ 第二次出现的下标是最小的。
输入:s = “abcdd”输出:”d”解释:只有字母 ‘d’ 出现两次,所以返回 ‘d’ 。
12345678910var repeatedCharacter = function(s) { let res = ''; for (let i = 0; i < s.length; i++) { if (s.indexOf(s[i]) != ...
二叉树的中序遍历
二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
输入:root = [1,null,2,3]
输出:[1,3,2]
12345678910111213var inorderTraversal = function(root) { const res = []; const stack = [root]; while (stack.length) { const v = stack.pop(); if (v instanceof TreeNode) { stack.push(v.right, v.val, v.left); } else if (v != null) { res.push(v); } } return res;}
使字符串平衡的最少删除次数
使字符串平衡的最少删除次数
给你一个字符串 s ,它仅包含字符 ‘a’ 和 ‘b’ 。你可以删除 s 中任意数目的字符,使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j ,且 s[i] = ‘b’ 的同时 s[j]= ‘a’ ,此时认为 s 是 平衡 的。请你返回使 s 平衡 的 最少 删除次数。
输入:s = “aababbab”输出:2解释:你可以选择以下任意一种方案:下标从 0 开始,删除第 2 和第 6 个字符(”aababbab” -> “aaabbb”),下标从 0 开始,删除第 3 和第 6 个字符(”aababbab” -> “aabbbb”)。
输入:s = “bbaaaaabb”输出:2解释:唯一的最优解是删除最前面两个字符。
12345678910111213var minimumDeletions = function(s) { const sList = s.split('') const n = sList.length let aCount = sList.r ...
密钥格式化
赎金信
给定一个许可密钥字符串 s,仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n + 1 组。你也会得到一个整数 k 。我们想要重新格式化字符串 s,使每一组包含 k 个字符,除了第一组,它可以比 k 短,但仍然必须包含至少一个字符。此外,两组之间必须插入破折号,并且应该将所有小写字母转换为大写字母。返回 重新格式化的许可密钥 。
输入:S = “5F3Z-2e-9-w”, k = 4
输出:”5F3Z-2E9W”
解释:字符串 S 被分成了两个部分,每部分 4 个字符;注意,两个额外的破折号需要删掉。
12345678910111213141516171819let licenseKeyFormatting = function(s, k) { const ans = []; let cnt = 0; for (let i = s.length - 1; i >= 0; i--) { if (s[i] !== '-') { cnt++; ...
赎金信
赎金信
两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。
输入:ransomNote = “a”, magazine = “b”
输出:false
输入:ransomNote = “aa”, magazine = “ab”
输出:false
输入:ransomNote = “aa”, magazine = “aab”
输出:true
12345678var canConstruct = function(ransomNote, magazine) { for (let mg of magazine) { if (ransomNote.includes(mg)) { ransomNote = ransomNote.replace(new RegExp(mg), '') ...
移动零
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。必须在不复制数组的情况下原地对数组进行操作。
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
123456789let moveZeroes = function(nums) { let slowIndex = 0; for (let fastIndex = 0; fastIndex < nums.length; fastIndex++) { if (nums[fastIndex] !== 0) { [nums[slowIndex], nums[fastIndex]] = [nums[fastIndex], nums[slowIndex]]; slowIndex++; } }};
浏览器的缓存机制
浏览器缓存是前端的老友,常见的是发版后,测试却发现没有变化,使用 ctr + F5 强制刷新之后、或清除浏览器缓存,才能正常展示
对于浏览器缓存,前端对它是又爱又恨,有时想保留,有时想禁掉,所以其机制是究竟为何
什么是浏览器缓存
浏览器缓存就是浏览器根据 url 第一次访问网站之后,将网站的 html、css、js、图片等文件复制一份保留到浏览器中,当你二次访问这个 url 的网站时,如果网站没有明确表示有更新时,浏览器直接在缓存中查找内容,不会再次请求网页内容,只有网页明确表示有更新时,浏览器才会向服务器发起网路请求,再次下载网页。
浏览器缓存优点
减少网络带宽消耗
对于网站运营者或者访问网页的用户,带宽代表着成本 ,使用浏览器缓存可以减少网络流量,从而降低运营成本。
降低服务器压力
使用浏览器缓存之后,除第一次访问需要向服务器请求网站全部资源,后续访问可以重复使用浏览器本地缓存,减少对服务器的请求,间接降低服务器的压力,同时,搜索引擎的爬虫也会根据缓存过期机制降低抓取的频率,也可以降低服务器压力。
减少网络延迟,加快网页加载
浏览器缓存 web 资源后,减少网络请求 ...
竖直打印单词
竖直打印单词
给你一个字符串 s。请你按照单词在 s 中的出现顺序将它们全部竖直返回。单词应该以字符串列表的形式返回,必要时用空格补位,但输出尾部的空格需要删除(不允许尾随空格)。每个单词只能放在一列上,每一列中也只能有一个单词。
输入:s = “HOW ARE YOU”输出:[“HAY”,”ORO”,”WEU”]解释:每个单词都应该竖直打印。“HAY”“ORO”“WEU”
输入:s = “TO BE OR NOT TO BE”输出:[“TBONTB”,”OEROOE”,” T”]解释:题目允许使用空格补位,但不允许输出末尾出现空格。“TBONTB”“OEROOE”“ T”
12345678910111213141516var printVertically = function(s) { let arr = s.split(" "); let res = []; let maxLen = 0; for (let a of arr) { maxLen = Math.max(a.length, maxLen); } ...
分割等和子集
分割等和子集
给定一个非空的正整数数组 nums ,请判断能否将这些数字分成元素和相等的两部分。
输入:nums = [1,5,11,5]输出:true解释:nums 可以分割成 [1, 5, 5] 和 [11] 。
输入:nums = [1,2,3,5]输出:false解释:nums 不可以分为和相等的两部分
12345678910111213141516171819202122var canPartition = function(nums) { let len = nums.length; //看做背包问题,将元素放入和一半大小的背包,能放下说明可以分为两个和相同的子集。 let sum = nums.reduce((a,b)=>a+b,0); if(sum&1) return false;//和为奇数无法等分 let bage = sum>>1;//背包大小 let dp = [];//dp[i][j]前i个物品选出了体积j的物品,最大的价值 for(let i=0;i<len;i++ ...