Python 代码段
二分查找
def lower_bound(array, first, last, value):
# 返回[first, last)内第一个不小于value的值的位置
while first < last: # 搜索区间[first, last)不为空
mid = first + (last - first) // 2 # 防溢出
if array[mid] < value:
first = mid + 1
else:
last = mid
return first # last也行,因为此时重合
def upper_bound(array, first, last, value):
# 返回[first, last)内第一个大于value的位置
while first < last: # 搜索区间[first, last)不为空
mid = first + (last - first) // 2 # 防溢出
if array[mid] <= value:
first = mid + 1
else:
last = mid
return first # last也行,因为此时重合
[first, last)中与value 等价的元素的范围就是:
[lower_bound(value), upper_bound(value))
,(左闭)下界和(右开)上界
// 无重复元素搜索时,更方便
func search(nums []int, target int) int {
start := 0
end := len(nums) - 1
for start <= end {
mid := start + (end-start)/2
if nums[mid] == target {
return mid
} else if nums[mid] < target {
start = mid+1
} else if nums[mid] > target {
end = mid-1
}
}
// 如果找不到,start 是第一个大于target的索引
// 如果在B+树结构里面二分搜索,可以return start
// 这样可以继续向子节点搜索,如:node:=node.Children[start]
return -1
}
位操作统计二进制中 1 的个数
count = 0
while a:
a = a & (a - 1);
count += 1;
}
3行代码解一元一次方程
def solve(eq, var='x'):
eq1 = eq.replace("=", "-(") + ")"
c = eval(eq1, {var:1j})
return -c.real/c.imag
solve("x - 2*x + 5*x - 46*(235-24) = x + 2") # 3236.0