🎯 今日学习目标
🧩 1. 刷 LeetCode
return (high + 1) / 2 - low / 2;
- 心得复盘: 看到题目,最简单的想法就是直接A掉,确实也直接A了。但是又没看清楚题,返回了个数组。
提交看了时间复杂度才想到,这是可以通过数学计算优化的。想了几分钟才想明白这个数学逻辑,时间复杂度O(1),空间复杂度O(1)。但看了灵神才知道有更优的解法:前缀和思想,0 到 high(包含high)的奇数个数,减去0 到 low-1 的奇数个数。
int s = reduce(salary.begin(), salary.end());
auto [m, M] = ranges::minmax(salary);
return (double) (s - m - M) / (salary.size() - 2);
- 心得复盘: 利用STL中的sort后很简单的题,但有个坑是数据类型。一开始用的int sum进行加和,最后return double(sum/(salary.size()-2)) 时看起来时浮点数,但是是整型转double,小数全为0。
我的想法是排序才能找到最大最小值,实际上找到最大最小值不用排序。
for (int b : bills) {
if (b == 5) { // 无需找零
five++;
} else if (b == 10) { // 返还 5
five--;
ten++;
- 心得复盘: 自己在纸上想了会判断对了。嵌套的判断写法还可以再优化,另外如果多想一下可以减少不必要的内容(比如对二十美元的记录)。
std::sort(nums.begin(), nums.end(), std::greater<int>());
- 心得复盘: 思维大于代码的题,但是开敲前应该再仔细审题。开写前还搜了面积公式,但是没必要。从大到小排序语法需要学会。
🐍 2. 语法学习 菜鸟教程
int s = reduce(salary.begin(), salary.end());
reduce作用:与 std::accumulate 类似,计算容器内所有元素的总和。
与accumulate的区别:reduce 默认不指定初始值(从0开始),且运算可能不保证顺序(对于加法这种可结合可交换的操作,这能允许编译器或运行时进行并行优化,效率更高)。
auto [m, M] = ranges::minmax(salary);
ranges::minmax(salary):一次调用,返回一个包含最小值和最大值的 pair 或 tuple。
auto [m, M]:结构化绑定,自动将返回的 pair 解包到变量 m(最小值)和 M(最大值)中。这比传统的 std::tie 或手动访问 .first、.second 要优雅得多。
std::sort(nums.begin(), nums.end());
std::sort(nums.begin(), nums.end(), std::greater<int>());
从小到大排序和从大到小排序
💡 3. 算法学习 Hello,算法——看完第三章了
- 首先需要指出,数字是以“补码”的形式存储在计算机中的。
原码:我们将数字的二进制表示的最高位视为符号位,其中0表示正数,1表示负数,其余位表示数字的值。
反码:正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。
补码:正数的补码与其原码相同,负数的补码是在其反码的基础上加1。

ASCII码 大写A从65开始,小写a从97开始
ASCII 字符集、GBK 字符集、Unicode 字符集、UTF-8 编码。在文件存储或网络传输中,我们通常会将字符串编码为 UTF-8 格式,以达到最优的兼容性和空间效率。
📖 4. 408 基础巩固
- 科目: 数据结构 (操作系统 / 计网 / 计组)
- 重点笔记:
📌 今日小结
早上到的挺早,并且这周的组会都开完了,没有别的干扰,冲!
🎯 今日学习目标
🧩 1. 刷 LeetCode
提交看了时间复杂度才想到,这是可以通过数学计算优化的。想了几分钟才想明白这个数学逻辑,时间复杂度O(1),空间复杂度O(1)。但看了灵神才知道有更优的解法:前缀和思想,0 到 high(包含high)的奇数个数,减去0 到 low-1 的奇数个数。
我的想法是排序才能找到最大最小值,实际上找到最大最小值不用排序。
std::sort(nums.begin(), nums.end(), std::greater<int>());🐍 2. 语法学习 菜鸟教程
int s = reduce(salary.begin(), salary.end());reduce作用:与 std::accumulate 类似,计算容器内所有元素的总和。
与accumulate的区别:reduce 默认不指定初始值(从0开始),且运算可能不保证顺序(对于加法这种可结合可交换的操作,这能允许编译器或运行时进行并行优化,效率更高)。
auto [m, M] = ranges::minmax(salary);ranges::minmax(salary):一次调用,返回一个包含最小值和最大值的 pair 或 tuple。
auto [m, M]:结构化绑定,自动将返回的 pair 解包到变量 m(最小值)和 M(最大值)中。这比传统的 std::tie 或手动访问 .first、.second 要优雅得多。
从小到大排序和从大到小排序
💡 3. 算法学习 Hello,算法——看完第三章了
原码:我们将数字的二进制表示的最高位视为符号位,其中0表示正数,1表示负数,其余位表示数字的值。
反码:正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。
补码:正数的补码与其原码相同,负数的补码是在其反码的基础上加1。
📖 4. 408 基础巩固
📌 今日小结
早上到的挺早,并且这周的组会都开完了,没有别的干扰,冲!