LeetCode双周赛解题:字符串解码与数学优化技巧
1. 比赛概述与解题思路上周参加了LeetCode第179场双周赛这次比赛题目质量不错前三题涵盖了字符串处理、贪心算法和数学思维等典型编程竞赛考点。作为每周固定的算法练习这类比赛对保持编程手感很有帮助。下面分享我对Q1-Q3的解题思路和实现细节。2. Q1字符串解码问题2.1 题目分析题目要求将给定格式的字符串解码其中包含数字和字母的组合。例如输入a2b3c1需要输出aabbbc。这类字符串操作题在笔试面试中很常见。2.2 解题思路采用双指针法遍历字符串一个指针定位字母字符另一个指针定位后续的数字将字母重复数字指定的次数后拼接def decodeString(s): res [] i 0 while i len(s): char s[i] if char.isalpha(): num_start i 1 while num_start len(s) and s[num_start].isdigit(): num_start 1 count int(s[i1:num_start]) res.append(char * count) i num_start else: i 1 return .join(res)2.3 注意事项注意处理连续数字的情况如a12b考虑字符串末尾没有数字的特殊情况时间复杂度O(n)空间复杂度O(n)3. Q2灯泡开关问题3.1 问题描述给定n个灯泡的初始状态和一系列操作求最终亮着的灯泡数量。每次操作会切换指定倍数位置的灯泡状态。3.2 解题思路通过观察可以发现每个灯泡被切换的次数等于其编号的因数个数只有完全平方数的因数个数为奇数因此最终亮着的灯泡数量等于⌊√n⌋import math def bulbSwitch(n): return int(math.sqrt(n))3.3 优化技巧使用数学方法避免模拟操作注意大数情况下的精度问题时间复杂度O(1)空间复杂度O(1)4. Q3时间显示问题4.1 题目要求将给定的秒数转换为HH:MM:SS格式处理各种边界情况。4.2 实现方案使用整除和取模运算分解时间单位def formatTime(seconds): hours seconds // 3600 seconds % 3600 minutes seconds // 60 seconds % 60 return f{hours:02d}:{minutes:02d}:{seconds:02d}4.3 常见错误忘记处理单数字情况的前导零错误计算时间单位转换如用100进制而非60进制未考虑输入为0的特殊情况5. 比赛经验总结字符串处理要注意边界条件和特殊输入数学类问题多观察规律避免暴力解法时间/日期问题要小心单位换算和格式化输出建议先写测试用例验证边界情况Python内置函数如math.sqrt可以大幅简化代码这类周赛题目很适合锻炼基础算法能力建议每周坚持参加并复盘错题。对于想提高编程能力的开发者系统性地刷题比随机做题效果更好。