修改Binary Search统计URL斜杠报错及URL排序优化咨询
错误原因拆解
- 遍历逻辑错误:
for i in data语句中,i是取出的URL字符串本身,不是数组下标,直接用data[i]取值会触发索引错误,numpy数组只允许整数、切片等类型作为索引。 - 二分逻辑完全不成立:
- mid只在函数入口计算一次,没有根据每个字符串的长度、每次二分的边界动态更新
- counter变量没有初始化就累加,还用到了未定义的
end变量 - 调用函数时传入的low、high固定为0,没有对应单个待统计字符串的首尾索引
- 批量处理URL逻辑冗余:手动逐个处理每个URL变量,完全可以用列表推导式或循环批量完成,你之前注释的循环不生效是因为直接遍历数组元素时修改的是临时副本,不会改动原数组的值。
简化实现方案
如果你不需要强行基于二分实现统计,直接用Python字符串内置的count()方法就能完成'/'数量统计,代码量极少且不易出错。如果确实需要练习二分改造,也可以参考下方的正确二分实现。
修复后完整代码
import numpy as np # 直接把所有url放到列表里,不需要单独定义10个变量 urls = [ "https://diversity.google", "https://www.aboutamazon.com/workplace/diversity-inclusion", "https://www.indeed.com/q-Diversity-jobs.html?vjk=ba073b4704d48c67", "https://careers.linkedin.com/diversity-and-inclusion", "https://github.com/about/diversity", "https://www.apple.com/diversity/", "https://www.samsung.com/us/about-us/diversity-and-inclusion/", "https://diversity.fb.com", "instagram:none", "https://careers.twitter.com/en/diversity.html" ] # 批量对每个url做字符排序,一行搞定,不需要逐个处理 sorted_urls = [''.join(sorted(url)) for url in urls] data = np.array(sorted_urls) # 正确的二分统计字符数量函数 def count_char_by_binary(s: str, target: str) -> int: n = len(s) # 先找第一个出现target的位置 left, right = 0, n-1 first_pos = n while left <= right: mid = (left + right) // 2 if s[mid] >= target: first_pos = mid right = mid -1 else: left = mid +1 if first_pos == n or s[first_pos] != target: return 0 # 再找最后一个出现target的位置 left, right = first_pos, n-1 last_pos = first_pos while left <= right: mid = (left + right) //2 if s[mid] <= target: last_pos = mid left = mid +1 else: right = mid -1 return last_pos - first_pos +1 # 批量统计每个url的'/'数量 counter_array = np.array([count_char_by_binary(url, '/') for url in data]) print(counter_array) # 如果不需要用二分,直接用内置方法更简单: # counter_array = np.array([url.count('/') for url in urls])
额外说明
- 如果你要对URL列表做排序,直接调用
sorted(urls)即可,不需要手动拆分合并 - 后续生成评分和饼图可以直接用counter_array的统计结果,用matplotlib的pie方法就能快速生成
内容的提问来源于stack exchange,提问作者tquigg96
相关产品推荐
相关产品推荐

