【面试精选】30道C++ 基础高频题整理(附答案背诵版)

腾讯后台开发实习面经:一面至HR面全流程复盘与避坑指南 后台开发是互联网技术领域的核心方向,要求开发者具备扎实的算法基础、计算机系统知识以及分布式系统设计能力。面试中常围绕操作系统、网络、数据库、缓存等底层原理展开,并通过手写代码和项目深挖考察候选人的工程实践素养。系统设计题则侧重考查技术选型与架构演进思维。在准备大厂后台岗位时,构建从基础概念到应用场景的完整知识体系,并通过复盘迭代查漏补缺,是提升通过率的有效路径。本文以腾讯后台开发实习面试为实例,完整复盘一面、二面、三面及HR面的考察重点与应对策略,并为即将参加技术面试的读者提供可复用的准备方法。 阅读详情

🍅关注【墨岚创客】,回复【毕设】,赠送免费毕设资源,具体联系方式见文末🍅

1. C和C++有什么区别?

C++是C语言的超集(我看网上很多文章说这是不对的),这意味着几乎所有的C程序都可以在C++编译器中编译和运行。然而,C++引入了许多新的概念和特性,使得两种语言在一些关键点上有显著的区别。

以下是C和C++的一些主要区别:

  1. 面向对象编程:C++支持面向对象编程(OOP),包括类、对象、继承、封装、多态等特性。这使得C++更适合大型软件项目,因为OOP可以提高代码的重用性和可读性。C语言是一种过程性语言,没有这些特性。
  2. STL(Standard Template Library):C++提供了STL,这是一套强大的模板类和函数的库,包括列表、向量、队列、栈、关联数组等。这些可以大大提高开发效率。C语言没有内置的数据结构库。
  3. 异常处理:C++提供了异常处理机制,可以更优雅地处理错误情况。C语言处理错误通常依赖于函数返回值。
  4. 构造函数和析构函数:C++支持构造函数和析构函数,这些特殊的函数允许对象在创建和销毁时执行特定的代码。C语言没有这个概念。
  5. 运算符重载:C++允许运算符重载,这意味着开发者可以更改已有运算符的行为,或者为用户自定义类型添加新的运算符。C语言不支持运算符重载。

例如,如果我们要创建一个复数类并对其进行算术运算,C++的面向对象和运算符重载特性就非常有用。我们可以定义一个复数类,然后重载+、-和*运算符以执行复数的加法、减法和乘法。这样,我们就可以像处理内置类型一样处理复数对象。反观C语言,我们需要定义结构体来存储复数,并且需要写一堆函数来处理复数的加法、减法和乘法。

2. C语言的结构体和C++的有什么区别

C语言的结构体和C++的结构体在基本的使用上是相似的,都是用来封装多个不同或相同类型的数据。然而,C++中的结构体继承了C++面向对象的特性,与C语言中的结构体有一些关键性的区别:

  1. 成员函数:C++的结构体可以包含成员函数(包括构造函数和析构函数),而C语言的结构体不能。
  2. 访问控制:C++的结构体支持公有(public)、保护(protected)和私有(private)三种访问控制级别,而C语言的结构体中的所有成员都是公有的。
  3. 继承:C++的结构体可以从其他结构体或类继承,而C语言的结构体不能继承。

举个例子,假设我们需要创建一个表示日期的结构体,包含年、月、日这三个字段,并且需要一个函数来检查日期是否有效。在C语言中,我们需要定义一个结构体和一个独立的函数:

struct Date {
    int year;
    int month;
    int day;
};

// 独立函数
int is_valid_date(struct Date date) {
    // 验证日期的逻辑
}

在C++中,我们可以将这个函数作为结构体的成员函数:

struct Date {
    int year;
    int month;
    int day;

    bool is_valid() const {
        // 验证日期的逻辑
    }
};

这样,在C++中使用时,我们可以直接调用成员函数 is_valid(),代码更加清晰和易于维护。

Date date;
//...
if (date.is_valid()) {
    //...
}

3. C 语言的关键字 static 和 C++ 的关键字 static 有什么区别

在C和C++中,static关键字有三个主要的用途,但其在C++中的用法更加丰富:

  1. 在函数内部:在C和C++中,static关键字可用于函数内部变量。此时,此变量的生命周期将贯穿整个程序,即使函数执行结束,这个变量也不会被销毁。每次调用这个函数时,它都不会重新初始化。这可以用于实现一些需要保持状态的函数。
  2. 在函数外部或类内部:在C和C++中,static关键字可以用于全局变量或函数。此时,此变量或函数的作用域被限制在定义它的文件内,无法在其他文件中访问。这可以防止命名冲突或不必要的访问。
  3. 在类内部:只有C++支持此用法。在C++中,static关键字可以用于类的成员变量或成员函数。对于静态成员变量,无论创建多少个类的实例,都只有一份静态成员变量的副本。静态成员函数则可以直接通过类名调用,而无需创建类的实例。

以下是一个C++中使用static的例子:

class MyClass {
public:
    static int count; // 静态成员变量,所有实例共享一份

    MyClass() {
        count++; // 每次创建实例,计数加1
    }

    static int getCount() { // 静态成员函数,通过类名直接调用
        return count;
    }
};

int MyClass::count = 0; // 静态成员变量的初始化

int main() {
    MyClass a;
    MyClass b;
    MyClass c;

    std::cout << MyClass::getCount(); // 输出3,因为创建了3个实例
}

这个例子中,我们创建了一个名为MyClass的类,它有一个静态成员变量count和一个静态成员函数getCount()。每创建一个MyClass的实例,count就会增加1。我们可以直接通过类名调用getCount()来获取count的值,而无需创建类的实例。

4. C++ 和 Java有什么核心区别?

  1. C++和Java都是广泛使用的编程语言,但它们在设计理念、功能和用途上有很大的不同。以下是C++和Java的几个核心区别:
  2. 运行环境:Java是一种解释型语言,它的代码在JVM(Java虚拟机)上运行,这使得Java程序可以在任何安装有JVM的平台上运行,实现了“一次编写,到处运行”的理念。而C++是一种编译型语言,其代码直接编译成目标机器的机器码运行,因此需要针对特定平台编译。
  3. 内存管理:Java有自动内存管理和垃圾回收机制,程序员不需要直接管理内存。而在C++中,程序员需要手动进行内存的分配和释放,这提供了更大的控制力,但同时也增加了内存泄漏的风险。
  4. 面向对象编程:Java是一种纯面向对象的编程语言,所有的代码都需要包含在类中。与此不同,C++支持面向对象编程,但它也允许过程式编程。
  5. 错误处理:Java使用异常处理机制进行错误处理,而C++既支持异常处理,也支持通过返回值进行错误处理。
  6. 多线程:Java内置了对多线程的支持,而C++在C++11标准之后引入了对多线程的支持。
  7. 性能:因为C++的代码直接编译为机器码,所以它通常比Java程序运行得更快。但是,Java的跨平台能力和内置的垃圾回收机制使其在开发大型企业级应用时更具优势。

例如,如果你正在开发一个需要直接访问硬件,或者需要高性能数学计算的应用(比如游戏,图形渲染,科学计算),C++可能是一个更好的选择。而如果你正在开发一个大型的企业级web应用,Java的跨平台能力,内置的垃圾回收和强大的类库可能会更有优势。

5. C++中,a和&a有什么区别?

在C++中,a和&a表示的是两种完全不同的概念:

  1. a:当你在代码中写a时,你正在引用变量a的值。例如,如果你之前写的int a = 10;,那么a的值就是10。
  2. &a:&是一个地址运算符,它给出了变量a在内存中的位置。这被称作a的引用或者是指向a的指针。例如,如果你写int* p = &a;,那么p就是一个指向a的指针,你可以通过*p来访问或修改a的值。

这是C++中的一种基础概念,被称为指针和引用。通过指针和引用,你可以直接操作内存,这在很多情况下都非常有用,例如,动态内存分配,函数参数传递,数据结构(如链表和树)等等。

6. C++中,static关键字有什么作用?

在C++中,static关键字有多个用途,它的作用主要取决于它在哪里被使用:

  1. 在函数内部:如果static被用于函数内部的变量,那么它会改变该变量的生命周期,使其在程序的整个运行期间都存在,而不是在每次函数调用结束时被销毁。这意味着,这个变量的值在函数调用之间是保持的。
  2. 在函数外部:如果static被用于函数外部的全局变量或函数,那么它会将这个变量或函数的链接范围限制在它被定义的文件内。换句话说,这个变量或函数不能在其他文件中被直接访问。这可以帮助减少命名冲突,而且能提供一种控制变量和函数可见性的方式。
  3. 在类中:如果static被用于类的成员变量,那么该变量将会成为这个类的所有实例共享的变量,也就是说,类的每个实例都能访问到这个同样的变量。如果static被用于类的成员函数,那么这个函数可以直接通过类来调用,而不需要创建类的实例。

以下是一个C++中使用static的例子:

class MyClass {
public:
    static int count; // 静态成员变量,所有实例共享一份

    MyClass() {
        count++; // 每次创建实例,计数加1
    }

    static int getCount() { // 静态成员函数,通过类名直接调用
        return count;
    }
};

int MyClass::count = 0; // 静态成员变量的初始化

int main() {
    MyClass a;
    MyClass b;
    MyClass c;

    std::cout << MyClass::getCount(); // 输出3,因为创建了3个实例
}

在这个例子中,MyClass有一个静态成员变量count和一个静态成员函数getCount()。每次创建一个MyClass的实例,count就会增加1。我们可以直接通过类名调用getCount()来获取count的值,而无需创建类的实例。

7. C++中,#define和const有什么区别?

#define和const都可以用来定义常量,但它们在实现方式和使用上有一些区别。

  1. 预处理器与编译器:#define是预处理器指令,在编译前会被预处理器替换,它只是简单的文本替换,不进行类型检查,也不会分配内存。而const是编译器处理的,它会在编译时进行类型检查,确保你不会意外地改变它的值。
  2. 作用域:#define没有作用域的概念,一旦定义,到文件结束都有效。而const常量有作用域,它的作用范围限制在定义它的块或者文件中。
  3. 调试:在调试时,#define定义的宏常量无法查看,因为在预处理阶段就已经被替换掉了。而const定义的常量在调试过程中是可以查看的。

例如,考虑以下的代码:

#define PI 3.14
const double Pi = 3.14;

double area1 = PI * r * r; // 使用#define定义的常量
double area2 = Pi * r * r; // 使用const定义的常量

在这个例子中,PI是一个预处理器定义的宏,而Pi是一个const定义的常量。两者都可以用来计算圆的面积,但Pi在编译时进行类型检查,并且在调试过程中可以查看其值。

9. 静态链接和动态链接有什么区别?

静态链接和动态链接是两种不同的程序链接方式,它们主要的区别在于链接的时间和方式。

  1. 静态链接:在静态链接中,所有代码(包括程序本身的代码和它依赖的库的代码)都会在编译时期被合并为一个单一的可执行文件。这个可执行文件包含了程序运行所需的所有信息,因此它不依赖于任何外部的库文件。静态链接的优点是部署简单,因为不需要额外的依赖,只需要一个文件就可以运行。缺点是可执行文件通常会比动态链接的大,因为它包含了所有需要的代码,而且如果库更新,程序需要重新编译和链接。
  2. 动态链接:在动态链接中,程序的代码和它依赖的库的代码被分开。程序的可执行文件只包含了程序本身的代码和一些标记,这些标记表示程序在运行时需要链接到哪些库。当程序运行时,操作系统会负责加载这些库并进行链接。动态链接的优点是可执行文件更小,因为它不包含库的代码,而且多个程序可以共享同一份库,节省内存。此外,如果库更新,只需要替换库文件,程序无需重新编译和链接。缺点是部署稍微复杂一些,因为需要确保运行环境中有所需的库文件。

例如,假设我们有一个程序,它使用了一个数学库。如果我们静态链接这个库,那么所有的数学函数都会被包含在我们的可执行文件中,我们可以将这个文件复制到任何地方运行。如果我们动态链接这个库,那么我们的可执行文件就会小得多,但如果我们想在另一台机器上运行这个程序,我们就需要确保那台机器上也安装了这个数学库。

10. 变量的声明和定义有什么区别

在C++中,变量的声明和定义是两个不同的概念。

声明是告诉编译器某个变量的存在,以及它的类型。声明并不分配存储空间。例如,外部变量的声明extern int a;,这里只是告诉编译器有一个类型为int的变量a存在,具体的a在哪里定义的,编译器此时并不知道。

定义是声明的延伸,除了声明变量的存在和类型以外,还分配了存储空间。例如,int a;就是一个定义,编译器在这里为a分配了足够的存储空间来存储一个整数。

在C++中,一个变量可以被声明多次,但只能被定义一次。例如,我们可以在多个文件中声明同一个变量,但只能在一个文件中定义它。如果在多个地方定义同一个变量,编译器会报错。

举个例子,假设我们正在编写一个大型程序,这个程序有一个全局变量需要在多个文件中使用。我们可以在一个文件中定义这个变量,然后在其他需要使用这个变量的文件中声明它。这样,所有的文件都可以访问到这个变量,但只有一个文件负责管理它的存储空间。

11. typedef 和define 有什么区别

typedef和#define都是C++中用于定义别名的关键字,但它们的用途和行为有所不同。

typedef是C++的一个关键字,用于为现有的类型创建一个新的名称(别名)。例如,如果我们想要为unsigned long int创建一个更简单的别名,我们可以写typedef unsigned long int ulong;,然后在代码中就可以使用ulong来代替unsigned long int。typedef只能为类型定义别名,不能为值定义别名。

#define是预处理器的一个指令,用于创建宏。宏可以是一个值,也可以是一段代码。例如,#define PI 3.14159就定义了一个名为PI的宏,它的值是3.14159。#define的作用范围更广,它不仅可以为类型定义别名,也可以为值定义别名,甚至可以定义一段代码。

两者的主要区别在于:

  1. typedef仅作用于类型,而#define可以定义类型、值或者代码。
  2. typedef是由编译器解析的,而#define是由预处理器处理的。因此,typedef的作用范围是局部的,只在定义它的文件或作用域内有效,而#define的作用范围是全局的,一旦定义即在整个源代码中有效。
  3. typedef定义的别名会受到类型检查,而#define定义的宏不会。例如,如果你试图使用typedef为一个函数类型定义别名,然后使用这个别名定义一个整数,编译器会报错。但是如果你使用#define定义一个函数类型的宏,然后使用这个宏定义一个整数,预处理器会默默地接受。
  4. typedef可以处理模板化的类型,而#define不能。例如,typedef std::vector int_vector;是合法的,但是使用#define来做同样的事情就会出现问题。
  5. typedef定义的别名在调试时更友好。因为它是编译器处理的,所以在调试时可以看到别名。而#define定义的宏在预处理阶段就被替换掉了,所以在调试时看不到宏的名称,只能看到宏的值。

12. final和override关键字

final和override是C++11引入的两个关键字,主要用于类的继承和虚函数的覆盖。

  1. final:如果一个类被声明为final,那么它不能被继承。例如,class Base final { … };,此时任何试图继承Base的类都会导致编译错误。此外,如果一个虚函数被声明为final,那么它不能在派生类中被覆盖。例如,virtual void fun() final;,此时任何派生类试图覆盖fun()函数都会导致编译错误。
  2. override:如果一个虚函数被声明为override,那么编译器会检查这个函数是否真的覆盖了基类中的一个虚函数。如果没有,编译器会报错。这个关键字可以帮助我们避免因为拼写错误或者函数签名错误而导致的错误。例如,void fun() override;,如果基类中没有一个函数的签名和fun()完全匹配,那么编译器就会报错。

例如,假设我们有一个基类Animal和一个派生类Dog。Animal有一个虚函数make_sound(),Dog需要覆盖这个函数。如果我们在Dog的make_sound()函数声明中加上了override关键字,那么如果我们不小心将函数名拼写成了mkae_sound(),编译器就会因为找不到对应的基类函数而报错,帮助我们及时发现错误。

13. 宏定义和函数有何区别?

宏定义(#define)和函数是两种常见的在C++中编写代码的方式,但它们有一些重要的区别:

  1. 编译阶段:宏定义是在预处理阶段展开的,而函数是在编译阶段处理的。这意味着使用宏定义的代码在编译前就已经被预处理器替换掉了,而函数在编译阶段会生成对应的函数调用。
  2. 类型检查:函数在编译时会进行类型检查,而宏定义不会。这可能会导致宏定义在使用时出现错误,而在编译阶段并不会被发现。
  3. 效率:由于宏定义在预处理阶段就被替换,因此它没有函数调用的开销(如堆栈操作),所以在某些情况下可能更快。然而,过度使用宏定义可能会导致编译后的代码体积增大,因为每次使用宏都会插入一份宏的代码副本。
  4. 封装:函数提供了更好的封装,使得代码更易于阅读和维护。而宏定义由于其替换性质,可能会在复杂的表达式中产生不易察觉的错误。

例如,考虑一个简单的宏定义和函数,它们都用于计算两个值的最大值:

#define MAX(a, b) ((a) > (b) ? (a) : (b))

int max(int a, int b) {
    return a > b ? a : b;
}

如果我们使用MAX宏定义来计算MAX(i++, j++),由于宏展开,i和j可能会增加两次,这是一个副作用,可能导致不可预见的结果。而使用函数max(i++, j++),则不会有这个问题,因为函数参数的求值顺序是确定的,i和j只会增加一次。

14. sizeof 和strlen 的区别

sizeof和strlen是两个在C++中常用的函数,但它们的功能和用途有所不同:

  1. sizeof 是一个编译时操作符,它返回一个对象或者类型所占用的字节数。例如,sizeof(int)将返回4(在大多数现代系统中),sizeof(char)将返回1。如果你对一个数组使用sizeof,它将返回整个数组的大小,而不是数组中的元素个数。例如,int arr[10]; sizeof(arr);将返回40(在大多数现代系统中,因为一个int通常占用4个字节,所以10个int占用40个字节)。
  2. strlen 是一个运行时函数,它返回一个以空字符终止的字符串的长度。该长度不包括终止的空字符。例如,strlen(“hello”)将返回5。注意,strlen只能用于字符数组,且该字符数组必须以空字符(‘\0’)终止,否则strlen会继续读取内存,直到遇到一个空字符,这可能会导致未定义的行为。

举个例子,如果我们有一个字符数组char arr[10] = “hello”;,那么sizeof(arr)将返回10(因为arr是一个10个字符的数组,每个字符占用1个字节),而strlen(arr)将返回5(因为字符串"hello"的长度是5,不包括终止的空字符)。

15. 简述strcpy、sprintf 与memcpy 的区别

strcpy, sprintf, 和 memcpy 都是 C/C++ 标准库中的函数,用于处理字符串和内存,但它们的作用是不同的:

  1. strcpy:这个函数用于将源字符串复制到目标字符串。它会复制源字符串的所有字符,直到遇到终止的空字符,并在目标字符串的末尾添加一个空字符。例如,char dest[10]; strcpy(dest, “hello”);,这将会把字符串 “hello”(包括终止的空字符)复制到 dest 中。需要注意的是,如果源字符串的长度(包括终止的空字符)超过了目标字符串的大小,那么会导致缓冲区溢出,这可能会引发安全问题。
  2. sprintf:这个函数用于将格式化的数据写入字符串。它可以接受多个输入参数,并按照指定的格式将这些参数格式化为一个字符串,然后将这个字符串写入目标字符串。例如,char str[50]; sprintf(str, “Hello, %s!”, “world”);,这将会把 “Hello, world!” 写入 str。同样,如果格式化后的字符串长度(包括终止的空字符)超过了目标字符串的大小,那么会导致缓冲区溢出。
  3. memcpy:这个函数用于复制内存区域。它会从源内存区域复制指定数量的字节到目标内存区域。例如,char dest[10]; char src[10] = “hello”; memcpy(dest, src, 6);,这将会把 src 的前6个字节(包括终止的空字符)复制到 dest。memcpy 不会因为遇到空字符而停止复制,它总是复制指定的字节数,因此,如果指定的字节数超过了目标内存区域的大小,那么会导致缓冲区溢出。

总的来说,strcpy 和 sprintf 是处理以空字符终止的字符串的函数,而 memcpy 是处理内存的函数。在使用这些函数时,需要特别注意缓冲区溢出的问题。

由于内容太多,更多内容以链接形势给大家,点击进去就是答案了

16. volatile有什么作用

17. 一个参数可以既是const又是volatile吗

18. 全局变量和局部变量有什么区别?操作系统和编译器是怎么知道的?

19. 什么是C++中的指针和引用?它们有什么区别?

20. 数组名和指针(这里为指向数组首元素的指针)区别?

21. 一个指针占用多少字节?

22. 什么是智能指针?智能指针有什么作用?分为哪几种?各自有什么样的特点?

23. shared_ptr是如何实现的?

24. 右值引用有什么作用?

25. 悬挂指针与野指针有什么区别?

26. 指针常量与常量指针区别

27. 如何避免“野指针”

28. 句柄和指针的区别和联系是什么?

29. 说一说extern“C”

30. 对c++中的smart pointer四个智能指针:shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解

Rclone替代RaiDrive?零广告免费挂载Alist WebDAV到Windows资源管理器(含自启脚本) 本文详细介绍了如何使用开源工具Rclone替代RaiDrive,实现零广告、全免费的Alist WebDAV挂载方案。通过深入解析配置参数、提供完整的自启动解决方案和解决常见问题,帮助用户在Windows资源管理器中高效管理云存储,提升使用体验。 阅读详情

相关推荐

长短期记忆网络(Long Short-Term Memory networks, LSTM)

如何简单的理解LSTM——其实没有那么复杂:

weixin_39910711的博客 2万+

Google隐性招聘挑战:用可运行项目证明工程能力

在技术招聘中,‘作品即证明’正成为评估真实工程能力的核心范式。它超越算法刷题与白板面试,聚焦开发者能否基于真实痛点,交付可运行、可验证、有上下文的技术产出物——如CLI工具、自动化脚本或轻量级开源项目。其底层逻辑是考察问题定义、架构权衡、边界处理与文档表达等综合素养,而非单一编码技能。这类实践天然契合GitHub、Stack Overflow、技术博客等开发者日常场域,也高度匹配大厂对工程成熟度、协作意识与持续迭代能力的隐性要求。本文以Google的Hidden Hiring Challenge为切入点,解

xjwolaile的博客 419

ANSYS 2026 R1 Windows系统安装避坑指南:环境配置、模块部署与许可证实战

ANSYS作为主流CAE仿真平台,其安装部署已远超传统软件范畴,演变为涉及操作系统底层、GPU驱动兼容性、许可证微服务架构和统一缓存机制的系统工程。理解ANSYS安装原理,需从Windows 11 UEFI安全启动要求、DirectX 12 Ultimate图形栈依赖、gRPC架构的License Manager端口动态分配等核心机制切入;技术价值在于保障HFSS GPU加速、Fluent MPI并行稳定性及Workbench多模块协同可靠性;典型应用场景涵盖高校仿真实验室升级、工业设计院所平台重建及高性能

weixin_29251337的博客 1418

【保研复习】C++机试笔记

基于王道机试指南的C++机试板子

unsignedccccc的博客 583

ROS与UR10e机械臂实战:从零搭建到精准控制

本文详细介绍了如何从零开始搭建ROS与UR10e机械臂的开发环境,包括硬件准备、软件配置、网络设置以及MoveIt!运动控制实战。通过具体的代码示例和常见问题排查,帮助开发者快速掌握UR10e机械臂的精准控制技术,适用于工业自动化和实验室研究场景。

m3n5b7v8c9x的博客 772

Windows11上CUDA 12.3配PyTorch踩坑记:一条官网命令救了我的GPU加速

本文详细介绍了在Windows 11上配置CUDA 12.3与PyTorch的完整指南,包括环境准备、安装要点、兼容性解决方案和性能验证。通过官方推荐的conda命令和实用技巧,帮助开发者解决常见问题,实现高效的GPU加速,提升深度学习开发效率。

weixin_42528974的博客 109

【面试精选】30道C++11高频题整理(附答案背诵版)

在C++11中,引入了用户定义字面量(user-defined literals)的概念,允许程序员为字面量定义自己的后缀,从而创建自定义类型的字面量。这提供了一种更直观、更易于阅读的方式来表示特定类型的值。基本语法// 返回类型 operator"" 后缀名(参数类型 参数名)// 例如,定义一个用于表示长度的字面量后缀 _m// 返回以米为单位的长度在上面的示例中,是一个用户定义的字面量操作符,它允许使用_m后缀来表示长度。例如,10.5_m表示10.5米。用途增强可读性。

tyler的博客 1018

S7-200SMART系列全套接线说明

SMART200接线方法,输入,输出,模拟量,面板,扩展糟等,并且详细说明接线原理。

文都龙哥 1万+

LeetCode刷题实战指南:从零到精通的系统方法论与工程实践

算法与数据结构是计算机科学的核心基础,其原理在于通过特定的逻辑与数学模型,高效地组织、存储和处理数据,以解决各类计算问题。掌握它们的技术价值在于能显著提升软件工程师的问题抽象、分析与解决能力,是构建高性能、可扩展系统的关键。在应用场景上,无论是面试求职、技术竞赛,还是日常开发中的性能优化、架构设计,扎实的算法功底都至关重要。本文聚焦于LeetCode这一主流算法练习平台,深入探讨如何通过系统化的路径规划、科学的解题方法论以及工程化的实践技巧,将算法学习从零散的知识点积累,转变为可复用的能力体系,从而有效应对

weixin_30861459的博客 591

LTspice introduction - 2 LTspice的界面

LTspice的界面主要有两个:Schematic Capture和Waveform Viewer Schematic Capture 它主要是用来画电路图的,画完电路图之后,添加一些dot 命令同时选择一些仿真的参数,点击执行(Run)Waveform Viewer 如果你的仿真不是op point的话,一个都会打开它,在它里面你可以画图相应的图形。 有两种方式可以在Viewer

贾亮的专栏 3220

【QT开发教程】使用Qt进行蓝牙低功耗(BLE)编程

蓝牙低功耗(BLE,Bluetooth Low Energy)技术广泛应用于现代设备中,例如智能手表、健身追踪器和物联网设备。Qt提供了一套完整的Bluetooth模块,使开发者可以轻松地在应用程序中实现BLE通信功能。本文将介绍如何在Qt中进行BLE编程,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 2869

【AI Agent】2026年9月 AI Agent 全栈开发最新技术面试宝典(含高频+必背+大厂真题)

本文整理了2026年AI Agent全栈开发最新技术面试题,涵盖基础概念、核心框架和系统设计等关键领域。重点解析了AI Agent与普通Chatbot的本质区别(自主闭环执行能力)、Agentic Loop的完整工作流程(规划-执行-观察-评估循环),以及ReAct范式的原理与适用场景。特别强调面试回答技巧:需结合工程实践中的典型问题、处理方案和量化指标,而非简单背诵定义。内容来自字节、阿里等大厂真实面经,适合3-5年经验开发者准备春招面试,突出考察候选人在复杂场景下的技术决策能力。

小江的记录本 4618

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

算法大师! 417

用LlamaIndex构建个人RAG知识库:零基础打造专属数字分身

RAG(检索增强生成)是一种将大语言模型与私有数据动态结合的关键技术,其核心在于解耦记忆与推理——由向量检索精准定位事实,由LLM组织可信回答。相比微调成本高、提示工程易失效,RAG以低门槛、高可控性成为个人知识管理的首选方案。LlamaIndex凭借对中文语义的深度适配、直观的索引抽象(如VectorStoreIndex、SummaryIndex)及开箱即用的文档处理能力,显著优于通用框架在中文场景下的检索准确率与工程效率。本文聚焦‘个人知识库’这一高频刚需场景,覆盖PDF/Markdown多源解析、语义

dieyuqi2955的博客 360

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

RabbitMQ 面试题

你发一条消息,在网络上并不是一个整体飞过去的。如果消息比较大,RabbitMQ 的底层协议会把它切成多个数据包(帧),按顺序发送,Broker 收到后再拼起来。假设线程 T1 和 T2 同时用同一个 Channel 发消息:T1 发消息 A,被切成三个帧:[A1] [A2] [A3]T2 发消息 B,也被切成三个帧:[B1] [B2] [B3]如果没有任何保护,这两个线程的帧可能交错到达 Broker,变成 [A1] [B1] [A2] [B2] [A3] [B3]。

互联网叫兽 513

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

smart-tunnel-ai · 隧道/高速智慧化 AI 应用项目

面向的工程师:一个能跑通、能改、能讲清楚的 Spring Boot + Spring AI 项目。:它不是「调了个 ChatClient 输出一句话」,而是把切块策略、增量入库、来源溯源、防幻觉、工具调用、结构化输出、评估集、密钥守卫、CI 护栏这些工程问题都落到了代码里。每一处都能指向具体类讲取舍。详见。

futurn_hero的博客 300

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 208

Docker镜像优化:面试高频翻车的简单题

本文深入探讨Docker镜像优化的两大核心层面:体积优化与构建速度优化。指出仅关注镜像瘦身(如使用Alpine)是表面理解,真正关键在于平衡空间与时间——在DevOps流水线中,构建速度常优先于体积。文章详解了多阶段构建、缓存利用、.dockerignore文件等高效策略,并揭示Alpine镜像虽小但存在兼容性、依赖缺失等风险,强调需结合业务场景权衡选择。掌握这些细节,方能在面试中展现真实技术深度,脱颖而出。

java后端架构 210

Spring 原理高频面试题全解:Bean 生命周期、三级缓存与 @Transactional 失效(2026 招聘 JD 真题复盘)

按 2026 招聘 JD 与一线面经整理 10 道 Spring 高频题:Bean 生命周期与扩展点顺序、AOP 代理生成时机、三级缓存为何必须三级、构造器注入循环依赖为何无解、@Transactional 六类失效与自调用修复三法、REQUIRES_NEW 连接池耗尽风险、事件总线同步语义与 @TransactionalEventListener、自动配置从 spring.factories 到 imports 的演进、自定义 Starter 三步走,附速查表与三条追问链。

蒙眼过河 317

AI 全栈开发工程师【二面】

传统的大模型应用通常采用:用户输入 → Prompt → LLM → 输出结果这种模式适合简单问答、文本生成和信息提取等任务。但对于复杂业务,仅依靠一次模型调用往往不够。例如,用户提出:帮我查询某个地区近三个月销量最高的产品,并分析销量变化原因。理解用户需求。拆解查询条件。调用数据库或外部工具。获取查询结果。分析数据。生成最终报告。Agent 的核心价值在于让大模型不仅能够生成文本,还能够根据任务目标进行规划、调用工具、观察执行结果,并根据结果调整后续行动。

qq_22841387的博客 452

【AI Agent面试系列】上下文管理1

工具返回价值密度最低、体积最大(常占 30%~60%),清理它收益最高、损失最小。摘要对话会丢语义细节,代价更高。按"价值密度从低到高"排序,不是按"体积从大到小"。

357

邓明 Agent 系统面试-意图识别学习笔记

不要只是做意图识别而不做测评,就好像要评估 RAG 准确性,在接口服务要测试响应时延,超时控制等等,这里也要关注意图识别准确率,如果面试官认为项目指标太高是在吹牛,关键就是回答因为 Agent 解决的是特定领域的意图识别,识别场景单一,另外就是因为用户输入相对简单。意图识别影响 prompt/spec 的加载,意图识别影响上下文组织,意图识别影响工具选择,意图识别影响 prompt 建议,意图识别得到的意图不是让模型随机生成而是候选类别里去做选择。2.意图识别的原因,以及意图识别得到的是什么?

m0_57222081的博客 215

上位机面试:值类型 vs 引用类型

大部分教程会告诉你"值类型在栈上,引用类型在堆上"。如果 ④ 和 ⑤ 都用 99,⑤ 打印出 99 时你分不清是"第 3 条和第 4 条是最容易混的,也是面试最爱追问的地方。很多人把"传引用类型的参数"当成"引用传递",这是错的。所以那句"引用类型比较就是比地址"不是通则——跑 100 万次对比,数量级差异很明显。记住这张图,下面所有现象都能推出来。这一行,才是真正的"按引用传递"。的核心原因——泛型不需要装箱。生效了"还是"根本没生效"。,比背"栈和堆"高一个层次。,这是测试设计的基本要求。

hanxiaodihhh的博客 226

华为运维面试题

华为面试注重真实经历与价值观契合,主管面采用STAR+价值观锚点+反思闭环框架,强调“我”的决策与量化结果。运维手撕题重思路表达与边界处理,需清晰复述、分步讲解、主动验证。云场景设计题须先澄清需求,再分层设计,兼顾可靠性与成本,突出取舍意识。通用心法:聚焦“我”、结构先行、主动说明边界与改进,以数字和反思收尾,展现复盘能力与华为文化匹配度。

dp340823的博客 162

AI 应用开发工程师(Agent 方向)【二面】

面试后半段,面试官介绍了团队的组织情况、技术方向以及岗位未来的工作内容。维度主要信息团队背景IT 部门负责生产、销售、财务、人资、物流等领域的信息化系统AI 发展方向将大模型与传统决策模型、RPA 等技术结合团队建设新成立 AI 智能应用研究团队技术平台更倾向于建设符合企业内部需求的 Agent 开发平台自建原因需要对接 ERP 和外部业务系统,同时满足权限、安全及业务逻辑要求岗位定位前期参与实际项目落地,逐步承担更完整的需求和方案设计工作成长方向。

qq_22841387的博客 147

# Linux 系统编程深度解析:从文件 I/O 到高并发网络

Linux 系统编程,就是用 C/C++ 等语言,直接调用 Linux 内核提供的接口(系统调用)来操作硬件资源(文件、内存、CPU、网络)的编程方式。你写过的 、、、,全部都是系统调用;你写过的 、、,是库函数,库函数底层最终还是调用系统调用。CPU 有特权级别(x86 上 ring 0 是内核态,ring 3 是用户态):应用程序跑在用户态。当你调用 时,CPU 会通过 或 指令触发陷入(trap),切换到内核态,由内核完成真正的磁盘读取,再切回用户态返回结果。 为什么要区分两个态? 安全:用户

LJM_X的博客 366
上一篇: 【面试精选】29道C++ 面向对象高频题整理(附答案背诵版)
下一篇: 【面试精选】30道C++11高频题整理(附答案背诵版)
想念@思恋
博客等级 码龄8年 6764粉丝 1015原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值