你有没有试过帮家里老人列一张买菜清单?比如今天要买土豆、青椒、鸡蛋,还要算好够不够做三顿饭。这看起来是生活小事,但背后就是最朴素的算法思维——把一个目标拆成可执行的步骤,再让每一步都靠谱。
先想清楚‘到底要干啥’
很多人一上来就敲代码,结果写到一半卡住,发现连输入和输出都没理清。比如想做个“找出数组里最小的数”,得先问自己:输入是一串数字吗?有没有重复?空数组怎么处理?输出只要数字,还是带下标?这些不是细节,是地基。就像去菜市场前,得先知道今天要做几个菜、几个人吃、冰箱还剩啥。
动手画一画,别急着写
拿“判断一个数是不是质数”举例。与其直接写 for 循环,不如先拿纸笔试试:17 是不是质数?我们一个个除:2 不行,3 不行……直到除到 4 就停了,因为 4×4=16<17,5×5=25>17,再往上试没意义。这个“试到平方根为止”的观察,就是算法优化的关键一步。
这种“手动推演几轮”的习惯,比背公式管用得多。很多初学者写的算法慢,不是语法错,是根本没想清逻辑边界。
代码只是翻译,不是创造
真正难的是把脑子里的步骤变成机器能懂的语言。比如“把列表从小到大排好”,人一看就懂,但计算机需要明确指令:
– 拿第一个数,跟后面每个比;
– 如果发现更小的,就换位置;
– 轮完一遍,最小的就挪到开头了;
– 接着处理剩下部分……
这就是选择排序的雏形。它不炫酷,但每一步都踩在地上:
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr别怕改,改才是常态
我第一次写二分查找,跑通了,但遇到空数组就报错;第二次加了判空,结果 mid 算错了,索引越界;第三次才发现 left 和 right 更新顺序不对……前后调了七遍。这不是失败,是算法在教你它的脾气。就像炒菜,盐放多了加水,火大了调小,没人一次就端出大师傅的锅气。
写算法不是拼记忆力,而是训练一种“拆解—验证—微调”的肌肉记忆。下次看到需求,不妨先放下键盘,泡杯茶,拿张纸,从“人怎么做”开始写起——那才是最真实的算法起点。