想一个"排好序就变简单"的问题。
C++ 入门 · 小纸条
选一章打印。双面打印(按长边翻页)后沿虚线剪开,每张卡片正面题目、背面答案。
不看资料默写冒泡排序。
加一个标记变量实现这个优化。
默写选择排序。
手动用插入排序排 5 3 8 1。
已经排好序的数组,插入排序要挪几次?
为什么选择排序不稳定?
什么场景下你会需要稳定排序?
查一下你用的语言里排序怎么调用。
按成绩从高到低排,规则怎么写?
参考答案(家长):双重循环,内层范围随外层递减。
参考答案(家长):如找出成绩最接近的两个同学。
参考答案(家长):外层定位置,内层找最小值的下标,最后交换一次。
参考答案(家长):每趟开始置假,发生交换就置真,一趟结束若仍为假就跳出。
参考答案(家长):一次都不用,只比较不挪动。
参考答案(家长):3 插到 5 前、8 留原位、1 插到最前,得 1 3 5 8。
参考答案(家长):多关键字排序时,靠稳定性保住前一次的顺序。
参考答案(家长):交换时会跨过中间元素,可能把相同值的顺序换掉。
参考答案(家长):比较时返回"前者成绩大于后者"。
参考答案(家长):C++ 用 sort,Python 用 sort 或 sorted。
写出"成绩降序、同分学号升序"的规则。
一万个数里找一个,最坏要比几次?
一万个数二分查找最多几次?
无序数据想用二分,该先做什么?
写完二分,先拿只有 1 个和 2 个元素的数组试。
数组 1 2 2 2 3 里找第一个 2,在第几位?
猜数字游戏用的是不是这个思路?
这是用什么换什么?
数组 1 2 3 4 的前缀和是什么?
上题中第 2 到第 4 个的和怎么算?
参考答案(家长):一万次。
参考答案(家长):先判成绩不等就按成绩,相等则按学号。
参考答案(家长):先排序。
参考答案(家长):约 14 次(2 的 14 次方大于一万)。
参考答案(家长):第 2 位(下标 1)。
参考答案(家长):小数据能手动验证,最容易暴露边界错误。
参考答案(家长):用一点额外空间,换查询速度。
参考答案(家长):正是。每次猜中间、根据反馈砍掉一半。
参考答案(家长):10 减 1 得 9,正是 2+3+4。
参考答案(家长):1、3、6、10。
给第 2 到第 4 个各加 5,差分数组要改哪两处?
差分和前缀和是什么关系?
统计 0 到 100 的分数分布,要几个桶?
这种排序适合什么数据?
什么时候该放弃桶的思路?
为什么这样不会漏掉答案?
把数组里的 0 全挪到末尾,怎么用双指针做?
这比枚举所有子段快在哪?
拿硬币凑钱时,你会怎么拿?
这说明什么?
参考答案(家长):互为逆运算,一个求和一个作差。
参考答案(家长):第 2 个加 5,第 5 个减 5。
参考答案(家长):值域小、数量大的整数,比如全班分数。
参考答案(家长):101 个。
参考答案(家长):每次移动都排除了不可能的组合,范围只会缩小。
参考答案(家长):值域远大于数据量的时候。
参考答案(家长):每个元素最多进出窗口各一次,整体只需扫一遍。
参考答案(家长):一个指针扫描,遇到非 0 就放到另一个指针的位置并右移。
参考答案(家长):贪心不是万能的,用之前要验证或证明。
参考答案(家长):先拿面额大的 —— 这就是贪心的直觉。