位运算为何能让一行代码抵十行循环从底层原理到LeetCode完整通关指南
假设你需要统计一个整数二进制表示中1的个数。最直观的想法是:转成二进制字符串,遍历统计每个字符——代码大概十行左右。但如果告诉你,用一行循环就能搞定,甚至不需要字符串转换呢? ...
假设你需要统计一个整数二进制表示中1的个数。最直观的想法是:转成二进制字符串,遍历统计每个字符——代码大概十行左右。但如果告诉你,用一行循环就能搞定,甚至不需要字符串转换呢? ...
1961年,英国计算机科学家Tony Hoare在为机器翻译项目开发字典排序功能时,发明了一种在当时看来极其反直觉的算法:随机选择一个元素作为基准,将数组分成两部分递归排序。这个算法就是后来统治计算机排序领域半个多世纪的快速排序。 ...
假设你需要为$n$个城市铺设光缆,每两个城市之间的铺设成本各不相同。如何用最低的总成本让所有城市互联互通?这看似是一个复杂的优化问题,实际上可以抽象为图论中的经典问题——最小生成树(Minimum Spanning Tree,简称MST)。 ...
1966年,计算机科学家们在设计操作系统时面临一个核心问题:当内存空间有限而需要存储的数据量无限增长时,应该删除哪些数据?这个看似简单的问题催生了缓存淘汰策略的研究。在众多策略中,LRU(Least Recently Used,最近最少使用)因其简单直观的思想和优秀的实际表现,成为应用最广泛的缓存淘汰算法之一。 ...
1956年的某个早晨,荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)在阿姆斯特丹的一家咖啡馆里,只用20分钟就在脑海中设计出了最短路径算法。当时他正在和未婚妻逛街,甚至没有用纸笔——这个"20分钟的发明"后来成为计算机科学史上最著名的算法之一,被广泛应用于GPS导航、网络路由、社交网络分析等无数领域。 ...
如果你在面试中被问到"如何在无序数组中找到第K大的元素",你的第一反应是什么?排序?用堆?这些方法确实可行,但还有一种更优雅、更高效的方法——快速选择算法。它能在平均O(n)的时间内解决这个问题,而且代码简洁得令人惊讶。 ...
当你面对一棵表达式树 (1 + 2) * 3 时,不同的遍历顺序会得到完全不同的结果:前序遍历产生前缀表达式 * + 1 2 3,中序遍历还原原始表达式 1 + 2 * 3(需要括号),后序遍历产生后缀表达式 1 2 + 3 *——这正是逆波兰表示法,可以直接用于栈式计算器。这就是二叉树遍历的核心价值:遍历顺序决定了数据的处理方式。 ...