杂记 15

1 面试时手撕算法题会要求写怎么样的题解(完整的程序还是核心思路...)?

面试时手撕算法题的要求,既不同于纯理论讲解,也不同于完整可运行的工程代码,而是更注重 **"逻辑完整性 + 代码规范性 + 沟通清晰度"** 的平衡。具体来说,面试官通常希望看到这样的题解:

1. 先沟通思路,再动手写代码

面试的核心是考察你的思维过程,而非单纯写代码的速度。正确步骤是:

  • 快速理解题意后,先口头复述题目(确认没误解)
  • 说出你的解题思路(比如 "这道题可以用栈来解决,因为括号匹配符合先进后出的特性")
  • 分析时间 / 空间复杂度(比如 "遍历一次字符串,时间 O (n),栈最多存 n/2 个元素,空间 O (n)")
  • 提及边界情况(比如 "字符串长度为奇数时直接返回 false")

目的:让面试官看到你是 "有思路地写代码",而不是瞎猜或背答案。

2. 代码要 "能跑",但不必过度追求 "工程化"

核心要求是逻辑正确、无明显 bug,但可以适当简化:

  • 必须包含核心函数 :比如判断括号有效的isValid函数,要完整写出逻辑
  • 变量 / 函数命名规范 :用stack而不是s,用top而不是i,让代码易读
  • 处理边界条件:比如空字符串、长度为奇数、栈为空时遇到右括号等情况
  • 可以省略头文件 / 主函数 :除非面试官明确要求,否则不用写#includemain函数(但如果是 C/C++,要说明用到了strlen需要string.h
  • 不用写注释:面试时间有限,清晰的命名比注释更重要

反例

cpp 复制代码
// 不好的写法:命名混乱,边界处理缺失
bool f(char* s){
    int n=strlen(s);if(n%2)return 0;
    int a[1000],t=0;
    for(int i=0;i<n;i++){
        char c=s[i];
        if(c==')'){if(t==0||a[t-1]!='(')return 0;t--;}
        else if(c==']'){if(t==0||a[t-1]!='[')return 0;t--;}
        else if(c=='}'){if(t==0||a[t-1]!='{')return 0;t--;}
        else a[t++]=c;
    }
    return t==0;
}

正例

cpp 复制代码
// 好的写法:命名清晰,逻辑完整
bool isValid(char* s) {
    int length = strlen(s);
    // 边界条件:奇数长度直接无效
    if (length % 2 != 0) {
        return false;
    }
    // 用数组模拟栈,top指向栈顶下一个位置
    char stack[length + 1];
    int top = 0;
    
    for (int i = 0; i < length; i++) {
        char c = s[i];
        // 遇到右括号,检查栈顶是否匹配
        if (c == ')') {
            if (top == 0 || stack[top - 1] != '(') {
                return false;
            }
            top--;
        } else if (c == ']') {
            if (top == 0 || stack[top - 1] != '[') {
                return false;
            }
            top--;
        } else if (c == '}') {
            if (top == 0 || stack[top - 1] != '{') {
                return false;
            }
            top--;
        } else {
            // 左括号入栈
            stack[top++] = c;
        }
    }
    // 栈为空说明所有括号匹配
    return top == 0;
}

3. 写错了不要慌,会调试更重要

如果代码有 bug(比如漏了某个条件),面试官更看重你如何排查

  • 主动说 "我来测试一下这个例子"(比如用示例 5"([)]"走一遍代码)
  • 发现错误后,清晰说出问题所在(比如 "这里栈顶是[,但右括号是),应该返回 false")
  • 修正时解释原因(比如 "刚才漏了检查栈顶元素是否和当前右括号对应")

关键:面试考察的是 "解决问题的能力",而不是 "一次写对的能力"。

总结:面试手撕算法的核心标准

  1. 思路清晰:能说清 "为什么用这个方法"
  2. 代码规范:命名合理,逻辑完整,无明显 bug
  3. 边界考虑:能想到特殊情况并处理
  4. 沟通顺畅:边写边说,错了能调试

记住:面试官不是在找 "完美的代码",而是在找 "能清晰解决问题的人"。

2 库和函数

【这种常见的库,函数 ,头文件是不是见到一个记住一个就好了,不用专门记,多多实践?】

你的想法非常对!对于 C 语言(或其他语言)的库、函数、头文件,"见一个记一个 + 多多实践" 是最高效的方式,完全没必要花大量时间专门死记硬背 ------ 因为这类知识的核心是 "用",不是 "背"。

为什么不用 "专门记"?

  1. 知识量太大,记不完 :C 标准库虽然不算特别庞大,但常用头文件(如<stdio.h> <string.h> <stdlib.h> <stdbool.h>)和对应的函数(printf/strlen/malloc/bool)有几十上百个,强行背会很快混淆(比如分不清strlen<string.h>还是<stdio.h>)。
  2. "用" 比 "记" 更深刻 :比如你第一次见strlen时,可能记不清它在哪个头文件,但当你因为没加<string.h>导致编译器报错,查完资料加上后,下次再用strlen就会自然想起要包含这个头文件 ------ 这种 "踩坑 + 解决" 的记忆,比单纯背书记得牢 10 倍。
  3. 场景化记忆更高效 :函数和头文件都是 "服务于具体需求" 的。比如你写 "判断括号有效性" 时需要算字符串长度,才会用到strlen;写 "拷贝字符串" 时才会用到strcpy------ 把函数和具体场景绑定,下次遇到相同需求,自然会想起对应的函数。

正确的做法:"见一个记一个 + 实践巩固"

可以分成 3 步,轻松掌握常用库 / 函数 / 头文件:

1. 第一次见:"留个印象 + 简单记录"

比如第一次在括号题里见到strlen

  • 先搞懂它的作用:计算字符串长度(不包含'\0');
  • 记清它的 "关键依赖":需要包含<string.h>(因为编译器会报错,你必须解决这个问题,自然就记住了);
  • 不用记复杂细节(比如返回值是size_t而非int)------ 初期只要知道 "怎么用、依赖什么" 就行。
2. 第二次见:"主动回忆 + 验证"

比如下次在 "最长回文子串" 题里又用到strlen

  • 先主动想:"这个函数是算长度的吧?需要包含哪个头文件来着?哦对,<string.h>";
  • 写代码时故意加上头文件,验证自己没记错 ------ 如果记混了(比如写成<stdio.h>),编译器报错后,再强化一次记忆。
3. 第三次及以后:"自然熟练"

当你在不同题目里用strlen3 次以上(比如算字符串长度、判断空字符串、循环遍历字符串),就会像用printf一样自然 ------ 不需要刻意想,手已经下意识写出#include <string.h>strlen(s)了。

小技巧:遇到 "忘了" 的情况,不用慌

面试或做题时,万一忘了某个函数的头文件 / 用法:

  • 对于 C/C++:可以先写核心逻辑,比如先用strlen,如果面试官问起,就说 "这里需要包含<string.h>头文件,因为strlen的声明在里面"------ 面试官更看重你 "知道依赖关系",而不是 "没忘";
  • 平时练习:忘了就查资料(比如翻 C 标准库手册、看菜鸟教程),查完后在代码里加个注释(比如// strlen需要包含<string.h>),下次再看代码时,又会巩固一次记忆。

总结

常用的库、函数、头文件,本质是 "工具"------ 就像你用螺丝刀多了,自然知道 "十字螺丝刀拧十字螺丝",不需要专门背 "螺丝刀型号对应螺丝类型"。只要你做题时遇到一个学一个,用得多了,自然会熟练掌握,完全不用有 "记不住" 的压力。

相关推荐
豆沙沙包?3 小时前
2025年--Lc182--sql(排序和分组)--Java版
java·数据库·sql
Zzz 小生3 小时前
编程基础学习(一)-Python基础语法+数据结构+面向对象全解析
开发语言·python
爱coding的橙子3 小时前
每日算法刷题Day70:10.13:leetcode 二叉树10道题,用时2h
算法·leetcode·深度优先
沐知全栈开发3 小时前
Bootstrap4 表格详解
开发语言
ghie90903 小时前
基于MATLAB的遗传算法优化支持向量机实现
算法·支持向量机·matlab
CryptoRzz3 小时前
欧美(美股、加拿大股票、墨西哥股票)股票数据接口文档
java·服务器·开发语言·数据库·区块链
杂货铺的小掌柜3 小时前
apache poi excel 字体数量限制
java·excel·poi
Never_Satisfied4 小时前
在JavaScript / HTML中,div容器在内容过多时不显示超出的部分
开发语言·javascript·html
大厂码农老A4 小时前
你打的日志,正在拖垮你的系统:从P4小白到P7专家都是怎么打日志的?
java·前端·后端