乐于分享
好东西不私藏

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

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

我是个编程爱好者,小白级别的,如果你跟我一样希望通过力扣刷题,学习各种奇妙的算法,可以关注我,大家一起学习。