167. 两数之和 II - 输入有序数组

力扣链接:167. 两数之和 II - 输入有序数组 力扣难度 中等 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。 以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。 你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。 你所设计的解决方案必须只使用 常量级的额外空间。 示例 示例 1: 输入:numbers = [2,7,11,15], target = 9 输出:[1,2] 解释:> 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。 示例 2: 输入:numbers = [2,3,4], target = 6 输出:[1,3] 解释:> 2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。 示例 3: 输入:numbers = [-1,0], target = -1 输出:[1,2] 解释:> -1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。 提示: 2 <= numbers.length <= 3 * 104 -1000 <= numbers[i] <= 1000 numbers 按 非递减顺序 排列 -1000 <= target <= 1000 仅存在一个有效答案 func twoSum(numbers []int, target int) []int { } func twoSum(numbers []int, target int) (ans []int) { // 双指针 头指向最小 尾指向最大 // 头 + 尾 < 目标数 头指针就要往尾移动 // 头 + 尾 > 目标数 尾指针就要往头移动 // 头 + 尾 = 目标数 返回答案 // 双指针 相遇 返回 nil j := 0 k := len(numbers) - 1 for j < k { f := target - (numbers[j] + numbers[k]) if f == 0 { return []int{j + 1, k + 1} } else if f > 0 { j++ } else if f < 0 { k-- } } return }

五月 1, 2025

1295_统计位数为偶数的数字

力扣链接: 1295. 统计位数为偶数的数字 力扣难度 简单 给你一个整数数组 nums,请你返回其中包含 偶数 个数位的数字的个数。 示例 1: 输入:nums = [12,345,2,6,7896] 输出:2 解释: 12 是 2 位数字(位数为偶数) 345 是 3 位数字(位数为奇数) 2 是 1 位数字(位数为奇数) 6 是 1 位数字(位数为奇数) 7896 是 4 位数字(位数为偶数) 因此只有 12 和 7896 是位数为偶数的数字。 示例 2: 输入:nums = [555,901,482,1771] 输出:1 解释: 只有 1771 是位数为偶数的数字。 提示: 1 <= nums.length <= 500 1 <= nums[i] <= 105 func findNumbers(nums []int) int { } func findNumbers(nums []int) int { // 计数 ans := 0 for _, v := range nums { i := 0 for v != 0 { i++ v /= 10 } if i%2 == 0 { ans++ } } return ans }

四月 30, 2025

160. 相交链表

160. 相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交**:** 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后,链表必须 保持其原始结构 。 自定义评测: 评测系统 的输入如下(你设计的程序 不适用 此输入): intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0 listA - 第一个链表 listB - 第二个链表 skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数 skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数 评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。 示例 1: **输入:**intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3 **输出:**Intersected at '8' **解释:**相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。 从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。 在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。 — 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。 示例 2: ...

三月 2, 2025

1287_有序数组中出现次数超过25%的元素

力扣链接: 1287. 有序数组中出现次数超过25%的元素 力扣难度 简单 算法评级: 3 理解常用数据结构和算法 难度分 1179 题目: 给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。 请你找到并返回这个整数 示例: 输入:arr = [1,2,2,6,6,6,6,7,10] 输出:6 提示: 1 <= arr.length <= 10^4 0 <= arr[i] <= 10^5 func findSpecialInteger(arr []int) int { } 👈点击 func findSpecialInteger(arr []int) (ans int) { n := len(arr) / 4 f := arr[0] i := 0 for _, v := range arr { if v == f { i++ } else { f = v i = 1 } if i > n { ans = f break } } return }

二月 17, 2025

1299_将每个元素替换为右侧最大元素

力扣链接: 1299. 将每个元素替换为右侧最大元素 力扣难度 简单 算法评级: 3 理解常用数据结构和算法 难度分 1219 题目: 给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。 完成所有替换操作后,请你返回这个数组。 示例 1: 输入:arr = [17,18,5,4,6,1] 输出:[18,6,6,6,1,-1] 解释: 下标 0 的元素 –> 右侧最大元素是下标 1 的元素 (18) 下标 1 的元素 –> 右侧最大元素是下标 4 的元素 (6) 下标 2 的元素 –> 右侧最大元素是下标 4 的元素 (6) 下标 3 的元素 –> 右侧最大元素是下标 4 的元素 (6) 下标 4 的元素 –> 右侧最大元素是下标 5 的元素 (1) 下标 5 的元素 –> 右侧没有其他元素,替换为 -1 示例 2: ...

二月 16, 2025

2264_字符串中最大的3位相同数字

力扣链接:2264. 字符串中最大的 3 位相同数字 力扣难度 简单 算法评级: 2 难度分 1309 题目: 给你一个字符串 num ,表示一个大整数。如果一个整数满足下述所有条件,则认为该整数是一个 优质整数 : 该整数是 num 的一个长度为 3 的 子字符串 。 该整数由唯一一个数字重复 3 次组成。 以字符串形式返回 最大的优质整数 。如果不存在满足要求的整数,则返回一个空字符串 "" 。 注意: 子字符串 是字符串中的一个连续字符序列。 num 或优质整数中可能存在 前导零 。 示例 1: 输入:num = “6777133339” 输出:“777” 解释:num 中存在两个优质整数:“777” 和 “333” 。 “777” 是最大的那个,所以返回 “777” 。 示例 2: 输入:num = “2300019” 输出:“000” 解释:“000” 是唯一一个优质整数。 示例 3: 输入:num = “42352338” 输出:"" 解释:不存在长度为 3 且仅由一个唯一数字组成的整数。因此,不存在优质整数。 ...

一月 8, 2025

3019_按键变更的次数

力扣链接:3019. 按键变更的次数 力扣难度 简单 算法评级: 2 知道常用数据结构和算法并简单使用 难度分 1176 题目: 给你一个下标从 0 开始的字符串 s ,该字符串由用户输入。按键变更的定义是:使用与上次使用的按键不同的键。例如 s = “ab” 表示按键变更一次,而 s = “bBBb” 不存在按键变更。 返回用户输入过程中按键变更的次数。 注意:shift 或 caps lock 等修饰键不计入按键变更,也就是说,如果用户先输入字母 ‘a’ 然后输入字母 ‘A’ ,不算作按键变更。 示例 1: 输入:s = “aAbBcC” 输出:2 解释: 从 s[0] = ‘a’ 到 s[1] = ‘A’,不存在按键变更,因为不计入 caps lock 或 shift 。 从 s[1] = ‘A’ 到 s[2] = ‘b’,按键变更。 从 s[2] = ‘b’ 到 s[3] = ‘B’,不存在按键变更,因为不计入 caps lock 或 shift 。 从 s[3] = ‘B’ 到 s[4] = ‘c’,按键变更。 从 s[4] = ‘c’ 到 s[5] = ‘C’,不存在按键变更,因为不计入 caps lock 或 shift 。 ...

一月 7, 2025

3083_字符串及其反转中是否存在同一子字符串

力扣链接:3083. 字符串及其反转中是否存在同一子字符串 力扣难度 简单 算法评级: 2 知道常用数据结构和算法并简单使用 难度分 1173 题目: 给你一个字符串 s ,请你判断字符串 s 是否存在一个长度为 2 的子字符串,在其反转后的字符串中也出现。 如果存在这样的子字符串,返回 true;如果不存在,返回 false 。 示例 1: 输入:s = “leetcode” 输出:true 解释:子字符串 “ee” 的长度为 2,它也出现在 reverse(s) == “edocteel” 中。 示例 2: 输入:s = “abcba” 输出:true 解释:所有长度为 2 的子字符串 “ab”、“bc”、“cb”、“ba” 也都出现在 reverse(s) == “abcba” 中。 示例 3: 输入:s = “abcd” 输出:false 解释:字符串 s 中不存在满足「在其反转后的字符串中也出现」且长度为 2 的子字符串。 func isSubstringPresent(s string) bool { } 🔑 答案解析: 👈点击 // isSubstringPresent 函数用于判断给定字符串 s 中是否存在一对字符的子串, // 这对字符以相反的顺序也出现过。 func isSubstringPresent(s string) bool { // 创建一个 26×26 的布尔数组 vis,用于记录每对字符是否出现过。 // 索引的含义是:vis[x][y] 表示字符 x 和字符 y 组成的子串是否出现过。 // 这里的 x 和 y 是字符在字母表中的索引,从 0 到 25 分别对应 'a' 到 'z'。 vis := [26][26]bool{} // 遍历字符串 s,从第二个字符开始,因为要检查相邻的两个字符组成的子串。 for i := 1; i < len(s); i++ { // 计算当前字符对中第一个字符在字母表中的索引。 // 例如,如果字符是 'a',则 x 为 0;如果是 'b',则 x 为 1,以此类推。 x := s[i-1] - 'a' // 计算当前字符对中第二个字符在字母表中的索引。 y := s[i] - 'a' // 将当前字符对标记为已出现过。 vis[x][y] = true // 检查是否存在相反顺序的字符对。 // 如果 vis[y][x] 为 true,说明字符 y 和字符 x 组成的子串也出现过, // 即找到了满足条件的子串,返回 true。 if vis[y][x] { return true } } // 如果遍历完整个字符串都没有找到满足条件的子串,返回 false。 return false }

十二月 28, 2024

3159_查询数组中元素的出现位置

力扣链接:3159. 查询数组中元素的出现位置 力扣难度 中等 算法评级: 2 知道常用数据结构和算法并简单使用 难度分 1263 题目: 给你一个整数数组 nums ,一个整数数组 queries 和一个整数 x 。 对于每个查询 queries[i] ,你需要找到 nums 中第 queries[i] 个 x 的位置,并返回它的下标。如果数组中 x 的出现次数少于 queries[i] ,该查询的答案为 -1 。 请你返回一个整数数组 answer ,包含所有查询的答案。 示例 1: 输入:nums = [1,3,1,7], queries = [1,3,2,4], x = 1 输出:[0,-1,2,-1] 解释: 第 1 个查询,第一个 1 出现在下标 0 处。 第 2 个查询,nums 中只有两个 1 ,所以答案为 -1 。 第 3 个查询,第二个 1 出现在下标 2 处。 第 4 个查询,nums 中只有两个 1 ,所以答案为 -1 。 示例 2: ...

十二月 28, 2024

3046_分割数组

力扣链接:3046. 分割数组 力扣难度 简单 算法评级: 2 知道常用数据结构和算法并简单使用 难度分 1212 题目: 给你一个长度为 偶数 的整数数组 nums 。你需要将这个数组分割成 nums1 和 nums2 两部分,要求: nums1.length == nums2.length == nums.length / 2 。 nums1 应包含 互不相同 的元素。 nums2也应包含 互不相同 的元素。 如果能够分割数组就返回 true ,否则返回 false 。 示例 1: 输入:nums = [1,1,2,2,3,4] 输出:true 解释:分割 nums 的可行方案之一是 nums1 = [1,2,3] 和 nums2 = [1,2,4] 。 示例 2: 输入:nums = [1,1,1,1] 输出:false 解释:分割 nums 的唯一可行方案是 nums1 = [1,1] 和 nums2 = [1,1] 。但 nums1 和 nums2 都不是由互不相同的元素构成。因此,返回 false 。 ...

十二月 28, 2024