每日力扣刷题与测试工作集合想法(1)

122 阅读3分钟

滑动窗口监控日志的异常+sql验证数据唯一性

1.引言:从题目到测试思维的跨越

  • 痛点引入
    “作为测试工程师,你是否遇到过这些难题:
    • 如何快速从海量日志中定位固定模式的异常请求?
    • 如何验证数据库中的业务逻辑是否符合预期?
      今天通过两道高频面试题,分享我的解决方案。”

2. 算法篇:567. 字符串的排列(滑动窗口)

题目解析
  • 问题重述:判断字符串s2是否包含s1的排列。
  • 测试映射
    “在接口测试中,我们常需监控连续错误请求是否符合某种规律(如5分钟内同一错误码出现3次)。滑动窗口算法可高效解决此类问题。”
代码实现(Python)
def check_inclusion(s1: str, s2: str) -> bool:
	#这个题目求是否包含不讲顺序的话,其实就是可以按在s2里面这个滑动窗口中出现的字符次数是否跟s1的字符次数一样,如果一样的话,就是包含,不一样的话就是不包含了
    # 这道题目需要维护的窗口是一个固定窗口,这个窗口的大小就是len(s1),在s2里面进行滑动
	#一个哈希集合用来存储s1字符串里面的计数
	#一个哈希函数用来放窗口的计数的
	if len(s1)>len(s2):
		return False
	
	s1_count=Counter(s1)
	window_count=Counter()
	left=0
	
	for right in range(len(s2)):
		#往窗口里面扩展内容
		window_count[s2[right]]+=1
		if right-left+1>len(s1):
			window_count[s2[left]]-=1
			if window_count[s2[left]]=0:
				del window_count[s2[left]]
			left+=1
			if window_count=s1_count:
				return Ture
	return False

测试场景应用示例

  • 场景:检测日志中是否连续出现3次“404”错误码。
  • 代码改造
    def check_error_pattern(logs: List[str], error_code: str, window_size: int) -> bool:
        need = {error_code: 3}  # 需要匹配3次
        window = defaultdict(int)
        left = 0
        for right in range(len(logs)):
            code = logs[right].split()[2]  # 假设日志格式为 [时间][接口][错误码]
            if code == error_code:
                window[code] += 1
            # 窗口滑动逻辑(略)
        return False
    

3. SQL篇:184. 部门工资最高的员工(多表关联)

题目解析
  • 问题重述:查询每个部门薪资最高的员工。
  • 测试映射
    “在数据测试中,需验证奖金分配、性能测试结果统计是否准确(如某API的响应时间最大值是否被正确记录)。”
代码实现(MySQL)
SELECT 
    d.name AS Department,
    e.name AS Employee,
    e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
WHERE (e.departmentId, e.salary) IN (
    SELECT departmentId, MAX(salary)
    FROM Employee
    GROUP BY departmentId
);
测试场景应用示例
  • 场景:验证性能测试结果表中,每个接口的最大响应时间是否被正确统计。
  • 改造查询
    -- 统计每个接口的最大响应时间及对应请求ID
    SELECT 
        api_name, 
        request_id, 
        response_time
    FROM performance_log
    WHERE (api_name, response_time) IN (
        SELECT api_name, MAX(response_time)
        FROM performance_log
        GROUP BY api_name
    );
    

4. 测试工程师的深度思考

  • 滑动窗口优化日志分析
    “传统正则匹配需遍历全文,时间复杂度O(n*m);滑动窗口将复杂度降至O(n),适合实时监控场景。”
  • SQL断言自动化
    “在自动化测试中,通过SQL查询快速验证数据库状态,替代人工检查,提升测试效率。”

5. 总结与GitHub联动

  • 总结
    “算法与SQL不仅是面试考点,更是测试工程师解决实际问题的利器。掌握其核心思想,能将测试效率提升一个台阶!”
  • Call to Action
    “本文完整代码及测试数据已开源至GitHub: chunchun1221 欢迎在评论区分享你在测试中应用的算法/SQL技巧 💬”