Python实现find_last函数:不使用len()查找目标串最后出现位置
不用
len()实现find_last函数的解决方案 嘿,我明白你现在的困境了——不用len()函数来写这个找最后匹配位置的函数确实有点绕,不过咱们一步步来搞定它!
首先,先纠正你代码里的明显问题:你把target = search这行写进去了,这会直接把搜索字符串覆盖成目标字符串,完全偏离了需求,得先把这行删掉才行。
接下来,咱们梳理实现思路:因为不能用len(),所以得手动计算字符串的长度,再从后往前遍历搜索字符串,检查每个可能的起始位置是否匹配目标字符串,找到第一个匹配的位置(也就是最后出现的那个)就返回,遍历完没找到就返回-1。
完整实现代码
def find_last(search, target): # 手动计算目标字符串的长度,替代len() target_len = 0 for char in target: target_len += 1 # 处理目标字符串为空的边界情况(按Python内置rfind逻辑返回搜索串长度) if target_len == 0: search_len = 0 for char in search: search_len += 1 return search_len # 手动计算搜索字符串的长度 search_len = 0 for char in search: search_len += 1 # 如果目标比搜索字符串长,直接返回-1 if target_len > search_len: return -1 # 从最后一个可能的起始位置开始倒序检查 start_pos = search_len - target_len while start_pos >= 0: # 截取当前起始位置的子串(和目标长度一致) current_sub = "" for i in range(target_len): current_sub += search[start_pos + i] if current_sub == target: return start_pos start_pos -= 1 # 遍历完无匹配,返回-1 return -1
代码细节解释
- 手动计算长度:通过遍历字符串的每个字符,用计数器累加的方式获取长度,完美替代
len()的功能。 - 边界场景处理:提前判断目标为空、目标比搜索串长的情况,避免无效遍历。
- 倒序匹配逻辑:从最后一个可能匹配的起始位置开始检查,一旦找到匹配就返回,这就是目标字符串最后出现的位置。
- 子串匹配:通过循环拼接子串来对比,完全不依赖
len()相关的切片操作。
测试验证
运行find_last('aaaa', 'a')时,会计算出target_len=1、search_len=4,起始位置从3开始检查,search[3:4]正好是'a',匹配成功后返回3,完全符合题目要求。
如果你想让代码更简洁,可以把长度计算逻辑抽成辅助函数复用:
def get_str_length(s): count = 0 for _ in s: count += 1 return count def find_last(search, target): target_len = get_str_length(target) search_len = get_str_length(search) if target_len == 0: return search_len if target_len > search_len: return -1 start_pos = search_len - target_len while start_pos >= 0: if search[start_pos:start_pos+target_len] == target: return start_pos start_pos -= 1 return -1
这个版本逻辑更清晰,同样没有用到len()函数,测试结果一致。
内容的提问来源于stack exchange,提问作者user4219935
相关产品推荐
相关产品推荐

