当前位置: 首页 > news >正文

力扣 最长公共前缀-14

最长公共前缀-14

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {//定义一个字符数组,用于存储strs字符串数组第一个字符串,方便与后面的字符串进行比较判断char s[200];//定义一个字符数组,用来返回结果char c[200];/*如果只有一个strs数组中只有一个字符串的情况下,这个字符串即为最长前缀直接将字符串的元素赋值到字符数组中然后返回字符数组*/if(strs.size()==1){for(int f=0;f<strs[0].length(); f++){c[f] = strs[0][f];}return c;}/*定义四个整形变量temp:temp用来存放第一个字符串与当前字符串中的每个字符进行比较,某个位置字符不相同时的位置,也表示当前公共前缀的长度Min:Min用来存储最短的前缀len:len表示每个字符串的长度flag:flag用来标记*/int temp = 0, Min = 205, len = 0, flag = 0;/*先将strs第一个字符串数组的第一个字符串中每个字符赋值到字符数组s中(s[i] = strs[0][i];),循环结束后++len为第一个字符串的长度*/for (int i = 0; i < strs[0].length(); i++) {s[i] = strs[0][i];++len;}//循环遍历字符数组中的每个字符串for (int i = 1; i < strs.size(); i++) {/*if判断用来判断第一个字符串是否小于当前字符串的长度,如果第一个字符串小于当前字符串的长度就将len更新为当前字符串的长度,防止遍历时遗漏字符*/if (len < strs[i].length())len = strs[i].length();//循环遍历字符数组中的当前字符串的每个字符,并于第一个字符串进行比较for (int j = 0; j < len; j++) {//如果某个字符串与第一个字符串(s字符数组)中的第一个字符不同,则strs字符串数组中没用公共前缀,直接返回""if(s[0]!=strs[i][0])return "";/*当遍历到当前字符与第一个字符中的字符不同时,则用temp记录当前位置(也是前缀的长度),然后利用min找最短公共前缀,将最短前缀存储到Min中,将flag置为1是用来防止每个字符串都相同的情况,最后结束当前字符串的遍历(break)*/if (s[j] != strs[i][j]) {temp = j;Min = min(Min,temp);flag = 1;break;}}}/*如果以上双层for循环结束后flag仍然为0,说明所有字符串都相同,直接将Min赋值为第一个字符串的长度即可如果没有flag标记,所有字符串都相同的情况下,Min的值为0,无法进行后续操作。*/if(flag == 0)Min = len;//最后将字符数组中最后一个字符串的最短前缀赋值到用来存储结果的字符数组c中,返回字符数组c;for (int k = 0; k < Min; k++) {c[k] = strs[strs.size() - 1][k];}return c;}
};

每日问题

什么是虚拟内存,为什么要使用虚拟内存,虚拟内存可能比物理内存大吗

1.什么是虚拟内存?

        虚拟内存是计算机系统内存管理的一种技术。它在操作系统的支持下,使用硬盘空间来模拟内存,为每个进程提供一个独立的、连续的虚拟地址空间。

        从进程的角度来看,它“认为”自己拥有连续的内存空间,这些地址被称为虚拟地址。当进程访问内存时,它使用的是虚拟地址,而操作系统会通过一种叫做内存管理单元(MMU)的硬件设备和相关的软件机制,将虚拟地址转换为物理地址,从而访问实际的物理内存或者硬盘上的交换空间(如果物理内存不足)。

        例如,在32位的操作系统中,每个进程通常由4GB的虚拟地址空间(2的32次方字节),这是一个很大的地址范围,给进程一种它拥有大量内存的错觉。

2.为什么要使用虚拟内存

程序隔离与保护

        每个进程都有自己独立的虚拟地址空间,这使得多个进程可以同时运行而不会干扰。例如,一个进程中的程序错误(如指针越界)通常不会影响到其他进程的内存空间,因为每个进程看到的是自己独立的虚拟内存。这就像每个家庭内部出现问题(程序错误),也不会轻易影响到其他家庭(其他进程)。

内存利用效率的提升

        程序在运行时,并不是所有的代码和数据都需要同时在物理内存中。虚拟内存允许将暂时不使用的部分程序代码和数据存储到磁盘上的交换空间,而只在需要的时候将其调入物理内存。这就好比一个图书馆(磁盘)有大量的藏书(程序代码和数据),但阅览室(物理内存)空间有限,管理员(操作系统)可以根据读者(进程)的需求,将需要阅读的书(代码和数据)从图书馆搬到阅览室,不需要的放回图书馆,从而更高效地利用有限的物理内存资源。

支持更大的程序运行

        虚拟内存可以为进程提供比实际物理内存更大的地址空间。这使得可以运行那些理论上需要比物理内存容量还大的内存空间的程序。例如,一些大型的图形处理软件或者数据库系统,它们可能需要处理大量的数据,如果没有虚拟内存,这些程序可能因为物理内存不足而无法运行。

3.虚拟内存可能比物理内存大吗

是的,虚拟内存可以比物理内存大。如前面所述,在32位操作系统下,每个进程通常有4GB的虚拟地址空间,而实际的物理内存可能远小于这个值。

当物理内存不足时,操作系统会将一部分暂时不使用的内存数据交换到磁盘上的交换空间(也称未页面文件),这个交换空间是虚拟内存的一部分。通过这种方式,从进程的角度来看,它仍然可以访问到比物理内存更多的内存空间,只是访问磁盘上的交换空间会比访问物理内存慢很多。

例如一台计算机有 8GB 的物理内存,但通过设置适当的虚拟内存(包括磁盘上的交换空间),可以让进程认为它们拥有比 8GB 大得多的内存空间,从而能够运行那些对内存需求较大的程序。不过,过度依赖磁盘交换空间会导致性能下降,因为磁盘 I/O 速度比内存访问速度慢很多。

C++函数的返回值在内存中的传递过程是什么

1.基本数据类型返回值的传递

寄存器传递(常见的优化方式)

        在现代编译器优化下,对于像int、double等基本数据类型的返回值,编译器通常会优先尝试使用寄存器来传递。例如,在x86架构中,EAX寄存器常用于返回int类型的值。当一个函数返回一个int类型的值时,函数体计算出这个值后,会将其存储到EAX寄存器中。

        例如,有一个简单的函数int add(int a,int b){ return a + b;},当这个函数执行return a + a;语句时,a+b的结果会被放入EAX寄存器,然后函数返回。调用这个函数的代码可以直接从EAX寄存器获取返回值。

栈传递(没有优化的情况)

        如果编译器没有进行寄存器传递的优化,或者由于某些特殊情况(如寄存器资源紧张等),基本数据类型的返回值也可能通过栈来传递。

        函数会在栈上预留一个空间来存储返回值。当执行return语句时,计算得到的返回值会被复制到这个栈空间中。调用函数会从这个栈空间中获取返回值。这种方式相对寄存器来说,速度会慢一些,因为访问栈内存比访问寄存器要慢。

2.对象(类类型)返回值的传递

拷贝构造函数参与的传递(无返回值优化)

        当函数返回一个对象时,在没有返回值优化(RVO,Return Value Optimization)的情况下,会涉及到拷贝构造函数。假设我们有一个类MyClass,定义如下:

class MyClass {
public:MyClass() {}MyClass(const MyClass& other) {// 拷贝构造函数的实现,用于复制对象的成员}
};

当函数MyClass getObject(){MyClass obj: return obj;}被调用时,在函数内部创建了一个MyClass对象obj。当执行return语句时,会调用MyClass的拷贝构造函数来创建一个新对象,这个新对象是obj的副本,并且这个副本会被传递给调用者。这个过程可能涉及到对象成员的逐个复制,对于包含大量数据成员或者动态分配内存的对象,这个复制过程可能会比较复杂和耗时。

返回值优化(RVO)和命名返回值优化(NRVO)

        为了提高效率,现代编译器通常会进行返回值优化。RVO主要是在函数返回一个临时对象时发挥作用。例如,在MyClass getObject(){ return MyClass(); }这种情况下,编译器可以直接在调用者期望接受返回值的内存位置构造对象,而不是先在函数内部构造一个对象,然后再复制一份传递给调用者。

编译器可以直接在调用者期望接受返回值的内存位置构造对象,这段话的意思:

  • 当函数返回一个临时对象时,例如MyClass getObject() { return MyClass(); }。
  • 编译器会直接在调用者期望接收返回值的内存位置(比如调用函数中用来接收返回值的变量所在的内存位置)构造这个对象。也就是说,不会先在函数内部创建一个临时对象,再将其复制到调用者的变量中,而是跳过中间的复制步骤,直接在目标位置 “原地” 构造对象。
  • 从内存角度看,假设调用函数中有MyClass result = getObject();,编译器会直接在result变量的内存空间构造MyClass对象,就好像函数内部的返回语句直接作用在result这个位置上一样。

        NRVO是RVO的一种扩展,适用于函数返回一个有名字的局部对象的情况,比如前面提到的MyClass getObject(){ MyClass obj; return obj;},编译器可以再适当的情况下,直接在调用者的内存位置构造obj的副本,避免了中间的复制过程。

3.指针和引用类型返回值的传递

指针返回值

        当函数返回一个指针时,实际上返回的是一个内存地址。这个内存地址可以是栈上的(例如返回一个指向函数局部变量的指针,不过这种情况要小心,因为函数返回后局部变量就销毁了),也可以是堆上的(例如通过 new操作符分配内存后返回指针)。

例如,int* createArray() { int* arr = new int[5];return arr;},这个函数返回一个指向堆上分配的int数组的指针。调用者可以通过这个指针来访问数组中的元素。不过,当调用者用完这个指针指向的内存后,需要通过delete[]来释放内存,以避免内存泄漏。

引用返回值

        引用返回值就像是给一个已经存在的变量起了另外一个名字,函数返回引用时,实际上返回的是对象的别名。例如,int& getValue( int& ret){ return ref;},这个函数返回传入引用参数的引用。调用者可以用过这个引用直接操作原始对象。引用返回值在一些情况下很有用,比如用于实现链式调用或者对对象进行原地修改等。不过和指针一样,返回引用是也要注意对象的生命周期,避免返回一个已经销毁的对象的引用

相关文章:

力扣 最长公共前缀-14

最长公共前缀-14 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//定义一个字符数组&#xff0c;用于存储strs字符串数组第一个字符串&#xff0c;方便与后面的字符串进行比较判断char s[200];//定义一个字符数组&#xff0c;用来返回…...

IDEA调整警告级别【IntelliJ IDEA 2024.2.0.1】

文章目录 目前现状鼠标悬停&#xff0c;选择配置筛选 > 取消选择OK效果 目前现状 需要把提示改成只要显示error的5个 鼠标悬停&#xff0c;选择配置 筛选 > 取消选择 OK 效果...

Vulnhub靶场 Billu_b0x 练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 文件包含2. SQL注入3. 文件上传4. 反弹shell5. 提权&#xff08;思路1&#xff1a;ssh&#xff09;6. 提权&#xff08;思路2&#xff1a;内核&#xff09;7. 补充 0x04 总结 0x00 准备 下载链接&#…...

Essential Cell Biology--Fifth Edition--Chapter one (6)

1.1.4.4 Internal Membranes Create Intracellular Compartments with Different Functions [细胞膜形成具有不同功能的细胞内隔室] 细胞核、线粒体和叶绿体并不是真核细胞中唯一的膜包围细胞器。细胞质中含有大量的[ a profusion of]其他细胞器&#xff0c;这些细胞器被单层膜…...

Jupyter Book 快捷键总结大全

快捷键完整分类与功能 1. 模式切换 在 jb 中&#xff0c;您可以通过快捷键快速切换编辑模式和命令模式&#xff1a; 快捷键功能Esc切换到命令模式Enter切换到编辑模式 2. 单元格操作 单元格是 jb 的基本操作单位&#xff0c;以下快捷键可以帮助您快速编辑和管理单元格&…...

Spring Authorization Server OAuth2.1

Spring Authorization Server介绍 Spring Authorization Server 是一个框架&#xff0c;它提供了 OAuth 2.1 和 OpenID Connect 1.0 规范以及其他相关规范的实现。 它建立在 Spring Security 之上&#xff0c;为构建 OpenID Connect 1.0 身份提供者和 OAuth2 授权服务器产品提供…...

解决”重复文件名重命名“问题【根据Word系统方式】

提示&#xff1a;工作中遇到的功能需求&#xff0c;在此记录&#xff0c;不喜勿喷&#xff01;谢谢 文章目录 前言一、需求分析二、需求实现 前言 最近工作中遇到的我认为有必要记录的需求实现&#xff0c;希望可以帮助到有同样需求的小伙伴们&#xff01; 提示&#xff1a;以…...

【PyTorch】PyTorch Geometric(PyG)安装指南:如何高效配置图神经网络环境

目录 引言一、通过 Anaconda 安装二、通过 PyPi 安装三、从 Wheels 安装四、从 ROCm 安装五、从源代码安装5.1 确保 CUDA 环境设置正确5.1.1 检查 PyTorch 是否支持 CUDA5.1.2 设置 CUDA 环境变量5.1.3 验证 nvcc 是否可用 5.2 安装 PyTorch Geometric 所需软件包5.3 强制重新安…...

SolidWorks21装配体中一个零件无法改为线架图

右键零件弹出栏中选择零部件显示改为默认显示&#xff0c;再切换线架图&#xff0c;就会发现整个装配体都能切换为线架图了&#xff01;...

11.11机器学习_介绍和定义

一、 机器学习介绍与定义 1. 机器学习定义 机器学习&#xff08;Machine Learning&#xff09;本质上就是让计算机自己在数据中学习规律&#xff0c;并根据所得到的规律对未来数据进行预测。 机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习&#xff08;Deep…...

【代码审计】常见漏洞专项审计-业务逻辑漏洞审计

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 0x01 漏洞介绍 1、 原理 业务逻辑漏洞是一类特殊的安全漏洞&#xff0c;业务逻辑漏洞属于设计漏洞而非实…...

SpringBoot单体服务无感更新启动,动态检测端口号并动态更新

SpringBoot单体服务无感更新启动 package com.basaltic.warn;import cn.hutool.core.io.IoUtil; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplic…...

CSS基础知识04

文本溢出通常是指在限定的空间内不能容纳所输入的文字&#xff0c;导致文字超出了容器的边界 一、文本溢出 1.1.css属性处理 所用到的属性 属性属性值overflowvisible&#xff1a;默认值&#xff0c;内容不会被修剪&#xff0c;会呈现在元素框之外。hidden&#xff1a;内容会…...

python程序对服务器cpu和内存资源占用的管理。

背景 在服务器上部署了一套目标检测的程序&#xff0c;做成while true 的轮询检测数据更新的定时任务。 结果没想到那台服务器还有一套可视化程序要给领导演示看&#xff0c;结果演示的时候平台各种报错。 然后通过top查看了一下资源利用率发现python的程序cpu 130。&#xf…...

java算法性能调优:详尽探讨时间复杂度与空间复杂度的分析与优化“

接下来我将带领大家进入Java数据结构的深入学习&#xff0c;让我们一同享受Java数据结构中的奥秘。 一、引言 二、时间复杂度 三、空间复杂度 四、Java中的时间复杂度和空间复杂度 五、优化时间复杂度和空间复杂度 七、时间复杂度和空间复杂度的重要性 一&#xff1a;时间…...

人工智能:塑造未来的工作与生活

目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角&#xff1a;人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…...

RK3568笔记六十九: 事件回调处理之Libevent 简单使用

若该文为原创文章,转载请注明原文出处。 一、前言 在项目开发过程中,事件处理使用相当多,特别是在UI处理的过程中,UI不能在非UI程里直接操作,否则会出现内存等异常,即不能在子线程里操作UI,所以用事件消息的方式通知UI线程刷新UI界面,在这一细节上掉了好多次坑。 Lib…...

MySQL如何解决幻读?

目录 一、什么是幻读&#xff1f; 1.1 幻读的定义 1.2 幻读的示例 1.3 幻读产生的原因&#xff1f; 1.4 读已提交&#xff08;Read Committed&#xff09; 1.4.1 确定事务等级 1.4.2 非锁定读取 准备 示例 结论 1.4.3 锁定读取 准备 示例 分析 结论 1.5 可重复读…...

Javascript_设计模式(二)

什么是迭代器模式?一般用在什么场景? 迭代器模式是一种行为型设计模式&#xff0c;它用于提供一种顺序访问聚合对象中各个元素的方法&#xff0c;而又不暴露该对象的内部表示。通过使用迭代器模式&#xff0c;可以遍历一个聚合对象&#xff0c;而无需关心该对象的内部结构和…...

时间同步服务器

1、时间同步服务&#xff1a;在多台主机协作时&#xff0c;确保时间同步&#xff0c;防止时间不一致造成的故障。 2、时间按同步实现&#xff1a; ntp 、chrony 3、命令&#xff1a;timedatectl timedatectl set-time "2024-02-13 10:41:55" timedatect…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

PydanticAI快速入门示例

参考链接&#xff1a;https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...