Excel:如何使用XLOOKUP函数的通配符模糊搜索

楔子
大家好,我是张桃狮。
最近我在做表的时候,使用xlookup的几率已经超过了vlookup。
不过我发现vlookup也是有它的优点的,比如默认支持通配符模糊搜索。
假设需要在A列找到包含C1的单元格,并返回B列对应的单元格。
可以输入公式
=VLOOKUP("*"&C1&"*",A:B,2,0)

但是vlookup只支持向右查找,不支持向左;只能返回第一个符合要求的结果,无法返回最后一个。
以上这些对xlookup来说都不是问题。
xlookup函数的通配符模糊搜索可以输入公式
=XLOOKUP("*"&C1&"*",A:A,B:B,,2)

通过这个例子,可以看出xlookup的通配符模糊搜索用法跟vlookup是一样的,都需要在查找值两边加上”*”。
xlookup函数还需要在公式最后加上参数,,2,才能开启模糊查找的开关。
如果需要返回最后一个符合要求的结果,可以在xlookup公式后面增加一个参数,-1。
=XLOOKUP("*"&C1&"*",A:A,B:B,,2,-1)

我是这么记忆的,XLOOKUP函数的通配符模糊搜索需要加上参数豆豆2(,,2),返回最后一个符合要求的结果需要加上参数豆豆豆-1(,,,-1)。
闲话讲完,咱们继续力扣做题学编程。
力扣303. 区域和检索 – 数组不可变
给定一个整数数组 nums,处理以下类型的多个查询:
计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right
实现 NumArray 类:
NumArray(int[] nums) 使用数组 nums 初始化对象
int sumRange(int left, int right) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] + nums[left + 1] + … + nums[right] )
示例 1:
输入:
[“NumArray”, “sumRange”, “sumRange”, “sumRange”]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出:
[null, 1, -1, -3]
解释:
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
提示:
0 <= left <= right < nums.length
最多调用 次 sumRange 方法
我的思路
我看不太懂题目,先看答案吧:(
力扣官方题解
class NumArray: def __init__(self, nums: List[int]): self.sums = [0] _sums = self.sums for num in nums: _sums.append(_sums[-1] + num) def sumRange(self, i: int, j: int) -> int: _sums = self.sums return _sums[j + 1] - _sums[i]
力扣官方的代码太抽象了,下面是豆包的代码。
豆包的代码
class NumArray: def __init__(self, nums: list[int]): n = len(nums) # 初始化前缀和数组,长度为 n+1,prefix[0] = 0 self.prefix = [0] * (n + 1) for i in range(n): # 计算前缀和 self.prefix[i+1] = self.prefix[i] + nums[i] def sumRange(self, left: int, right: int) -> int: # 核心公式:区间和 = 右边界前缀和 - 左边界前缀和 return self.prefix[right+1] - self.prefix[left]
力扣提交通过,初始化时间复杂度 O(n),查询时间复杂度 O(1),空间复杂度O(n)。
prefix[0] = 0 是哨兵位,当left=0时就不用更改代码了。
豆包的代码我看懂了,但是让我自己写不一定能写出来。
网友灵茶山艾府的代码
class NumArray: def __init__(self, nums: List[int]): self.s = list(accumulate(nums, initial=0)) def sumRange(self, left: int, right: int) -> int: return self.s[right + 1] - self.s[left]
力扣提交通过,初始化时间复杂度 O(n),查询时间复杂度 O(1),空间复杂度O(n)。
accumulate:迭代求和,生成前缀和序列。
accumulate(nums, initial=0) 就是自动算前缀和,且开头加了一个 0。
python竟然还有这么好用的东东,我竟然都不知道。
自己使用记得要先导入
from itertools import accumulate
我是个编程爱好者,小白级别的,如果你跟我一样希望通过力扣刷题,学习各种奇妙的算法,可以关注我,大家一起学习。
夜雨聆风