C/C++ 面试复习笔记(2)

news2025/6/7 3:26:30

C语言如何实现快速排序算法?

  • 答案:快排是一种分治算法,选择一个基准元素,将数据划分成两部分,然后递归排序

  • 补充:

void quick_sort(int arr[], int start, int end)
{
    //判断是否需要排序
    if (start >= end)
    {
        return;
    }
​
    int left = start;
    int right = end;
    int pivot = arr[left];  //基准值
    while (left < right)
    {
        //实现大于基准值的数字放到左边
        while ((arr[right] > pivot) && (left < right))
        {
            right--;
        }
        if (left < right)
        {
            arr[left] = arr[right]; //将基准值填入
            left++;
        }
            
        //实现小于基准值的数字放到右
        while ((arr[left] < pivot) && (left < right))
        {
            left++;
        }
        if (left < right)
        {
            arr[right] = arr[left]; //将基准值填入
            right--;
        }
        arr[left] = pivot;
    }
    //递归排序
    quick_sort(arr, start, left - 1);
    quick_sort(arr, right+1, end);
}

C语言中的setvbuf函数作用是什么?

  • 答案:setvbuf 用于设置文件流的缓冲区模式和大小,优化文件读写的性能。

  • 解析:setvbuf 可以设置缓冲区类型(如全缓冲、无缓冲、行缓冲),并定义缓冲区的大小, 适用于文件流的优化。

  • 补充:

缓冲区的类型

缓冲区分为三种类型:全缓冲、行缓冲和不缓冲。

1、全缓冲

在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。

2、行缓冲

在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。

3、不缓冲

也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

缓冲区的刷新

下列情况会引发缓冲区的刷新:

  1. 缓冲区满时;

  2. 执行fflush函数;

  3. 正常关闭文件。

  4. 正常退出程序或进程。

  5. 行缓冲遇到 \n刷新。

如何改变缓存类型

//与缓冲区相关的一些函数
#include <stdio.h>
void setbuf(FILE *stream, char *buf);
void setbuffer(FILE *stream, char *buf, size_t size);
void setlinebuf(FILE *stream);
​
​
int setvbuf(FILE *stream, char *buf, int mode , size_t size);
参数:
stream:这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
buffer:这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。
mode: 这指定了文件缓冲的模式:_IOFBF、_IOLBF、_IONBF。
size:这是缓冲的大小,以字节为单位。
返回值:
如果成功,则该函数返回 0,否则返回非零值。

VScode中的stdout属于无缓冲类型

Ubuntu中的stdout属于行缓冲类型(行缓冲遇到换行符会清空缓冲区,而全缓冲不会)

解释C语言中的volatile关键字并给出应用场景。

  • 答案:volatile 告诉编译器,该变量的值可能随时被外部因素改变,因此禁止优化该变量的读取和写入。

  • 解析:volatile 常用于多线程或硬件寄存器操作等场景,确保每次读取变量时都从内存中获取最新值,避免编译器优化。

  • 补充:

  1. volatile 的作用

    • 禁止优化:编译器通常会对变量进行优化,以提高程序的运行效率。例如,如果某个变量在代码中多次赋值,但是值没有改变,编译器可能会认为这个变量不再被使用,从而优化掉一些访问该变量的代码。但是,当变量是 volatile 类型时,编译器不会做这种优化,确保每次访问变量时都进行实际的读取或写入操作。

    • 外部改变volatile 修饰的变量通常表示该变量的值可以在程序的执行过程中被外部因素(如硬件设备或其他线程)改变。

  2. 常见的应用场景

    • 硬件寄存器:在嵌入式系统编程中,硬件设备的寄存器可能会随时被硬件更改。为了保证对这些寄存器的访问不会被优化掉,通常会用 volatile 修饰寄存器变量。

    • 多线程编程:在多线程程序中,如果一个线程在修改某个变量,而其他线程正在读取该变量,使用 volatile 修饰该变量可以确保每个线程读取到变量的最新值。

如何判断一个链表是否有环?

bool has_cycle(struct ListNode *head) { 
    struct ListNode *slow = head, *fast = head; 
    while (fast && fast->next) { 
        slow = slow->next; 
        fast = fast->next->next; 
    if (slow == fast) return true; 
    } 
    return false; 
} 

如何实现一个 LRU 缓存(Least Recently Used Cache)?

  • 答案:使用双向链表和哈希表结合来实现。哈希表提供快速的访问,双向链表维护访问顺序,当缓存满时,删除最久未使用的元素。

  • 解析:使用双向链表存储数据,哈希表存储键和节点的映射。每次访问数据时,将对应节点移到链表的头部。若缓存满了,删除链表尾部节点。

如何实现一个线程安全的计数器?

  • 答案:使用互斥锁(mutex) 或原子操作来确保多个线程同时访问时不会产生竞态条件。

  • 解析:使用pthread mutex_ t来加锁计数器的修改操作,确保线程安全。也可以使用原子操作(如atomic)来避免锁的开销。

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
int counter = 0; 
void increment() { 
    pthread_mutex_lock(&lock); 
    counter++; 
    pthread_mutex_unlock(&lock); 
} 
  • 补充:

std::atomic 是 C++ 提供的一种用于多线程编程的同步原语,保证对数据类型的操作是原子的,即不会被中断或与其他线程产生冲突。它适用于需要在线程之间共享数据而不需要加锁的场景,提供比传统的锁(如 std::mutex)更好的性能。

常用场景 std::atomic 通常用于以下情况:

共享资源的安全访问:在多线程程序中,多个线程需要访问和修改同一变量。 避免锁机制的开销:锁会带来性能上的开销,而 std::atomic 提供了更轻量的原子操作。 简单的同步:当仅需要单个变量的同步时,使用 std::atomic 是非常高效的。

std::atomic 支持的类型 内置基础类型:如 int, bool, char, float, double 等。 自定义类型:可以将自定义结构体/类声明为 std::atomic<T>,但必须保证其满足 "trivially copyable"(平凡可拷贝)要求,即没有自定义构造、析构、拷贝构造和赋值运算符等。

#include <iostream>
#include <atomic>
#include <thread>
​
std::atomic<int> counter(0); // 初始化原子计数器
​
void increment() {
    for (int i = 0; i < 10000; ++i) {
        counter.fetch_add(1, std::memory_order_relaxed); // 原子增加
    }
}
​
int main() {
    std::thread t1(increment);
    std::thread t2(increment);
​
    t1.join();
    t2.join();
​
    std::cout << "Final counter value: " << counter << std::endl; // 输出最终的计数器值
​
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 时间事件处理部分)

揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 时间事件&#xff1a;serverCron函数更新服务器时间缓存更新LRU时钟-lruclock更新服务器每秒执行命令次…

【DAY40】训练和测试的规范写法

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭drop…

el-select 实现分页加载,切换也数滚回到顶部,自定义高度

el-select 实现分页加载&#xff0c;切换也数滚回到顶部&#xff0c;自定义高度 1.html <el-form-item label"俱乐部&#xff1a;" prop"club_id" label-width"120px"><el-select :disabled"Boolean(match_id)" style"w…

Langchaine4j 流式输出 (6)

Langchaine4j 流式输出 大模型的流式输出是指大模型在生成文本或其他类型的数据时&#xff0c;不是等到整个生成过程完成后再一次性 返回所有内容&#xff0c;而是生成一部分就立即发送一部分给用户或下游系统&#xff0c;以逐步、逐块的方式返回结果。 这样&#xff0c;用户…

学习经验分享【40】目标检测热力图制作

目标检测热力图在学术论文&#xff08;尤其是计算机视觉、深度学习领域&#xff09;中是重要的可视化分析工具和论证辅助手段&#xff0c;可以给论文加分不少。主要作用一是增强论文的可解释性与说服力&#xff1a;论文中常需解释模型 “如何” 或 “为何” 检测到目标&#xf…

C#里与嵌入式系统W5500网络通讯(3)

有与W5500通讯时,需要使用下面的寄存器: PHYCFGR (W5500 PHY Configuration Register) [R/W] [0x002E] [0b10111XXX] PHYCFGR configures PHY operation mode and resets PHY. In addition, PHYCFGR indicates the status of PHY such as duplex, Speed, Link. 这张表格详细…

用OpenNI2获取奥比中光Astra Pro输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro&#xff0c;想在windows平台&#xff0c;和linux rk3588 &#xff08;香橙派&#xff0c;ubuntu2404,debian)上获取深度信息&#xff0c;之前的驱动下载已经不好用了,参考如下 Astra 3D相机选型建议 - 知乎https://zhuanlan.zhihu.com/p/594485674 …

Unity VR/MR开发-VR设备与适用场景分析

视频讲解链接&#xff1a;【XR马斯维】VR/MR设备与适用场景分析&#xff1f;【UnityVR/MR开发教程--入门】_游戏热门视频

Linux: network: switch:arp cache更新规则 [chatGPT]

文章目录 介绍概念普通包带有不同的mac,是否更新arp cache?普通包带有相同的mac,是否刷新 aging timeswitch是否会主动学习介绍 关于arp cache在switch侧的行为。有很多问题需要理解。 概念 HP L3 - IP Services Configuration Guide 文档里有写:dynamic arp entry的解说…

Java网络编程API 1

Java中的网络编程API一共有两套&#xff1a;一套是UDP协议使用的API&#xff1b;另一套是TCP协议使用的API。这篇文章我们先来介绍UDP版本的API&#xff0c;并尝试来写一个回显服务器&#xff08;接收到的请求是什么&#xff0c;返回的响应就是什么&#xff09;。 UDP数据报套…

兰亭妙微 | 医疗软件的界面设计能有多专业?

从医疗影像系统到手术机器人控制界面&#xff0c;从便携式病原体检测设备到多平台协同操作系统&#xff0c;兰亭妙微为众多医疗设备研发企业&#xff0c;打造了兼具专业性与可用性的交互界面方案。 我们不仅做设计&#xff0c;更深入理解医疗场景的实际需求&#xff1a; 对精…

前端原生构建交互式进度步骤组件(Progress Steps)

在现代网页设计中&#xff0c;进度步骤&#xff08;Progress Steps&#xff09; 是一种常见的 UI 模式&#xff0c;常用于引导用户完成注册流程、多步表单、教程或任何需要分步骤操作的场景。本文将带你从零开始构建一个美观且功能完整的 “进度步骤”组件&#xff0c;并详细讲…

【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数

Data Studio支持在您的数据分析代码中引用自定义的资源和函数&#xff08;支持MaxCompute、EMR、CDH、Flink&#xff09;&#xff0c;您需要先创建或上传资源、函数至目标工作空间&#xff0c;上传后才可在该工作空间的任务中使用。您可参考本文了解如何使用DataWorks可视化方式…

web3-以太坊智能合约基础(理解智能合约Solidity)

以太坊智能合约基础&#xff08;理解智能合约/Solidity&#xff09; 无需编程经验&#xff0c;也可以帮助你了解Solidity独特的部分&#xff1b;如果本身就有相应的编程经验如java&#xff0c;python等那么学起来也会非常的轻松 一、Solidity和EVM字节码 实际上以太坊链上储存…

【C++项目】负载均衡在线OJ系统-2

文章目录 oj_server模块编写oj_server框架的搭建-oj_server/oj_server.cpp 路由框架 oj_model模块编写题目信息设置v1.文件版本-common/util.hpp boost库spilt函数的使用-oj_server/oj_model_file.hpp 文件版本model编写v2.mysql数据库版本1.mysql创建授权用户、建库建表录入操…

GC1809:高性能24bit/192kHz音频接收芯片解析

1. 芯片概述 GC1809 是数字音频接收芯片&#xff0c;支持IEC60958、S/PDIF、AES3等协议&#xff0c;集成8选1输入切换、低抖动时钟恢复和24bit DAC&#xff0c;适用于家庭影院、汽车音响等高保真场景。 核心特性 高精度&#xff1a;24bit分辨率&#xff0c;动态范围105dB&…

2025年06月05日Github流行趋势

项目名称&#xff1a;onlook 项目地址url&#xff1a;https://github.com/onlook-dev/onlook项目语言&#xff1a;TypeScript历史star数&#xff1a;16165今日star数&#xff1a;1757项目维护者&#xff1a;Kitenite, drfarrell, spartan-vutrannguyen, apps/devin-ai-integrat…

基于BI PaaS架构的衡石HENGSHI SENSE平台技术解析:重塑企业级数据分析基座

在数据驱动决策的时代&#xff0c;传统BI工具日益显露出扩展性弱、灵活性差、资源利用率低等痛点。衡石科技推出的HENGSHI SENSE平台&#xff0c;创新性地采用BI PaaS&#xff08;平台即服务&#xff09;架构&#xff0c;为企业构建了一个强大、开放、可扩展的数据分析基础设施…

【R语言编程绘图-plotly】

安装与加载 在R中使用plotly库前需要安装并加载。安装可以通过CRAN进行&#xff0c;使用install.packages()函数。加载库使用library()函数。 install.packages("plotly") library(plotly)测试库文件安装情况 # 安装并加载必要的包 if (!requireNamespace("p…

通信刚需,AI联手ethernet/ip转profinet网关打通工业技术难关

工业人工智能&#xff1a;食品和饮料制造商的实际用例通信刚需 了解食品饮料制造商如何利用人工智能克服业务挑战 食品和饮料制造商正面临劳动力短缺、需求快速变化、运营复杂性加剧以及通胀压力等挑战。如今&#xff0c;生产商比以往任何时候都更需要以更少的投入实现更高的…