反转一个字符串里的字母后反转特殊字符-LeetCode
3823. 反转一个字符串里的字母后反转特殊字符 🎯 问题描述(来源于LeetCode) 描述: 给定一个字符串 s,该字符串只包含小写字母和特殊字符 "!@#$%^&*()"。 请先反转字符串中所有字母的顺序(但保持字母在原字母位置),再反转所有特殊字符的顺序(保持特殊字符在原来特殊字符位置),然后返回结果字符串。 说明: 字母和特殊字符互不干扰,各自反转。 反转是指将同类字符的顺序倒置。 示例: 示例 1: 123456输入: s = ")ebc#da@f("输出: "(fad@cb#e)"解释: 1. 提取字母 "ebc daf"?实际上字母按顺序为 e,b,c,d,a,f → 反转后 f,a,d,c,b,e。 2. 特殊字符顺序为 ),#,@,( → 反转后 (, @, #, )。 3. 填充后得到 "(fad@cb#e)"。 示例 2: 12输入: s = "z"输出: "z" 示例 3: 12...
字典序最小回文串-LeetCode
2697. 字典序最小回文串 🎯 问题描述(来源于LeetCode) 描述: 给定一个由小写英文字母组成的字符串 s,你每次操作可以将任意一个字符修改为任意一个小写字母。 请你返回将 s 变成回文串所需的最少操作次数?不,本题要求构造一个字典序最小的回文串,即通过修改某些字符(不限制操作次数),使得最终字符串是回文串,且字典序最小。 说明: 字典序比较:按从左到右的顺序比较字符。 回文串:正读反读相同。 可以修改任意位置的字符为任意小写字母。 示例: 示例 1: 123输入: s = "egcfe"输出: "efcfe"解释: 将 'g' 改为 'f',得到 "efcfe" 是回文串,且字典序最小。 示例 2: 123输入: s = "abcd"输出: "abba"解释: 将 'c' 改为 'b','d' 改为 'a',得到 "abba...
给植物浇水 II-LeetCode
2105. 给植物浇水 II 🎯 问题描述(来源于LeetCode) 描述: Alice 和 Bob 计划给一排植物浇水。植物排成一行,从左到右编号为 0 到 n-1。 Alice 从最左边(植物 0)开始,Bob 从最右边(植物 n-1)开始,他们同时向中间移动。 Alice 的水壶容量为 capacityA,Bob 的水壶容量为 capacityB。 当他们到达一株植物时,如果水壶中的水不足以浇灌该植物,他们必须重新装满自己的水壶(在当前位置),然后才能浇水。 他们各自独立行动,但每次只能浇一株植物。 如果两人同时到达同一株植物(即中间只剩一株植物),则水壶中剩余水量较多的人去浇灌(如果两人水量相同,Alice 去浇)。 求他们总共需要重新装满水壶的次数。 说明: 初始水壶是满的(容量分别为 capacityA 和 capacityB)。 植物需要的水量由 plants[i] 给出。 示例: 示例 1: 123456输入: plants = [2,2,3,3], capacityA = 5, capacityB = 5输出: 1解释: Alice 浇 0 ...
反转单词前缀-LeetCode
2000. 反转单词前缀 🎯 问题描述(来源于LeetCode) 描述: 给定一个字符串 word 和一个字符 ch,找出 ch 在 word 中第一次出现的位置(下标从 0 开始)。反转从位置 0 到该位置(含)的所有字符,并返回反转后的字符串。如果 ch 不存在于 word 中,则返回原字符串。 说明: 只需要反转前缀,不修改后缀。 示例: 示例 1: 123输入: word = "abcdefd", ch = "d"输出: "dcbaefd"解释: "d" 第一次出现在下标 3,反转前 4 个字符 "abcd" → "dcba"。 示例 2: 123输入: word = "xyxzxe", ch = "z"输出: "zxyxxe"解释: "z" 第一次出现在下标 2,反转前 3 个字符 "xyz" → "zyx"。 �...
反转字符串前缀 -LeetCode
3794. 反转字符串前缀 - Reverse String Prefix 🎯 问题描述(来源于LeetCode) 描述: 给定一个字符串 s 和一个整数 k,将字符串的前 k 个字符进行反转。其余字符保持原来的顺序。返回反转后的字符串。 说明: 1 <= s.length <= 100 0 <= k <= s.length(根据常见实现推断,可自行验证) 示例: 示例 1: 123输入: s = "abcd", k = 2输出: "bacd"解释: 前 2 个字符 "ab" 反转为 "ba",得到 "bacd"。 示例 2: 123输入: s = "xyz", k = 3输出: "zyx"解释: 前 3 个字符即整个字符串反转。 💻 解题思路 思路:字符串切片拼接 算法步骤 将字符串 s 分成两部分:前缀 pre = s[:k](前 k 个字符)和后缀 suf = s[k:](剩余字符)。...
垂直翻转子矩阵-LeetCode
3643. 垂直翻转子矩阵 🎯 问题描述(来源于LeetCode) 描述: 给你一个 m x n 的整数矩阵 grid,以及三个整数 x、y 和 k。 x 和 y 表示一个 正方形子矩阵 的左上角下标,k 表示该正方形子矩阵的边长。 你的任务是垂直翻转该子矩阵的行顺序(即上下翻转),并返回更新后的矩阵。 说明: 垂直翻转:子矩阵的第一行与最后一行交换,第二行与倒数第二行交换,以此类推。 子矩阵外的元素保持不变。 你可以直接在原矩阵上修改,也可以使用额外空间。 示例: 示例 1: 123输入: grid = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], x = 1, y = 0, k = 3输出: [[1,2,3,4],[13,14,15,8],[9,10,11,12],[5,6,7,16]]解释: 目标子矩阵为行 1-3、列 0-2。翻转前行顺序为:[5,6,7]、[9,10,11]、[13,14,15];翻转后行顺序变为:[13,14,15]、[9,10,11]、[5,6,7],列3保持不变。 示例 2: ...
翻转图像-LeetCode
832. 翻转图像 🎯 问题描述(来源于LeetCode) 描述: 给定一个二进制矩阵 image,先水平翻转每一行(即反转每一行的顺序),然后反转每个像素(0 变为 1,1 变为 0)。返回结果图像。 说明: 水平翻转:例如 [1,1,0] 变为 [0,1,1]。 反转像素:0 → 1,1 → 0。 示例: 示例 1: 123输入: image = [[1,1,0],[1,0,1],[0,0,0]]输出: [[1,0,0],[0,1,0],[1,1,1]]解释: 先水平翻转每行得到 [[0,1,1],[1,0,1],[0,0,0]],再反转像素得到结果。 示例 2: 12输入: image = [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]输出: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]] 💻 解题思路 思路一:分两步(水平翻转 + 反转像素) 算法步骤 遍历每一行 i,将该行水平翻转:image[i] = image[i][::-1]。 再次遍历每一行和每个元素,将 0 变...
包含所有三种字符的子字符串数目-LeetCode
1358. 包含所有三种字符的子字符串数目 🎯 问题描述(来源于LeetCode) 描述: 给定一个由字符 'a'、'b'、'c' 组成的字符串 s。请返回包含至少一个 'a'、一个 'b' 和一个 'c' 的子字符串数量。 说明: 子字符串是连续的。 s 的长度在 [3, 5×10^4] 之间。 示例: 示例 1: 123输入: s = "abcabc"输出: 10解释: 包含 a,b,c 的子串共有 10 个。 示例 2: 12输入: s = "aaacb"输出: 3 💻 解题思路 思路:滑动窗口(双指针) 算法步骤 将字符串转为字符列表(或直接迭代字符串)。 初始化左指针 left = 0,计数器 count = {'a':0, 'b':0, 'c':0},答案 ans = 0。 遍历右指针 right,将当前字符 s[right] 加入计数。 当窗口中同时包含至少一个 'a'、'b'、'c' 时,说明以当前左指针为起点、右指针为终点以及更右的终点,所有子串都满足条件。此时,left 表...
和相同的二元子数组-LeetCode
930. 和相同的二元子数组 🎯 问题描述(来源于LeetCode) 描述: 给定一个二元数组 nums(只包含 0 和 1)和一个整数 goal,统计并返回具有和 goal 的非空连续子数组的个数。 说明: 子数组是连续的。 1 <= nums.length <= 3 * 10^4。 示例: 示例 1: 123输入: nums = [1,0,1,0,1], goal = 2输出: 4解释: 有 4 个子数组满足和等于 2。 示例 2: 12输入: nums = [0,0,0,0,0], goal = 0输出: 15 💻 解题思路 思路:滑动窗口 + 容斥原理(基于您的代码) 算法步骤 定义辅助函数 getNums(k),该函数返回数组中和大于等于 k 的连续子数组个数。 在 getNums(k) 中: 初始化左指针 left = 0,当前窗口和 pre = 0,答案 ans = 0。 遍历右指针 right,将 nums[right] 加入 pre。 当 pre >= k 时,不断移动左指针(并将移出的元素从 pre 中减去),直...
统计「优美子数组」-LeetCode
1248. 统计「优美子数组」 🎯 问题描述(来源于LeetCode) 描述: 给定一个整数数组 nums 和一个整数 k。如果一个连续子数组中恰好有 k 个奇数数字,我们就称这个子数组为「优美子数组」。 请返回这个数组中「优美子数组」的数目。 说明: 子数组是连续的。 1 <= nums.length <= 5 * 10^4。 示例: 示例 1: 123输入: nums = [1,1,2,1,1], k = 3输出: 2解释: 包含 3 个奇数的子数组有 [1,1,2,1] 和 [1,2,1,1]。 示例 2: 12输入: nums = [2,4,6], k = 1输出: 0 💻 解题思路 思路:滑动窗口 + 容斥原理(基于您的代码) 算法步骤 将原数组 nums 转换为 0/1 数组:偶数 → 0,奇数 → 1。 定义辅助函数 atLeast(x),返回原数组中奇数个数至少为 x 的连续子数组的个数。 在 atLeast(x) 中: 使用滑动窗口维护当前窗口内奇数的个数(即 pre)。 遍历右端点 right,将 nums[righ...












