力扣 最长公共前缀-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) {//定义一个字符数组,用于存储strs字符串数组第一个字符串,方便与后面的字符串进行比较判断char s[200];//定义一个字符数组,用来返回…...
IDEA调整警告级别【IntelliJ IDEA 2024.2.0.1】
文章目录 目前现状鼠标悬停,选择配置筛选 > 取消选择OK效果 目前现状 需要把提示改成只要显示error的5个 鼠标悬停,选择配置 筛选 > 取消选择 OK 效果...
Vulnhub靶场 Billu_b0x 练习
目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 文件包含2. SQL注入3. 文件上传4. 反弹shell5. 提权(思路1:ssh)6. 提权(思路2:内核)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]其他细胞器,这些细胞器被单层膜…...
Jupyter Book 快捷键总结大全
快捷键完整分类与功能 1. 模式切换 在 jb 中,您可以通过快捷键快速切换编辑模式和命令模式: 快捷键功能Esc切换到命令模式Enter切换到编辑模式 2. 单元格操作 单元格是 jb 的基本操作单位,以下快捷键可以帮助您快速编辑和管理单元格&…...
Spring Authorization Server OAuth2.1
Spring Authorization Server介绍 Spring Authorization Server 是一个框架,它提供了 OAuth 2.1 和 OpenID Connect 1.0 规范以及其他相关规范的实现。 它建立在 Spring Security 之上,为构建 OpenID Connect 1.0 身份提供者和 OAuth2 授权服务器产品提供…...
解决”重复文件名重命名“问题【根据Word系统方式】
提示:工作中遇到的功能需求,在此记录,不喜勿喷!谢谢 文章目录 前言一、需求分析二、需求实现 前言 最近工作中遇到的我认为有必要记录的需求实现,希望可以帮助到有同样需求的小伙伴们! 提示:以…...
【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装配体中一个零件无法改为线架图
右键零件弹出栏中选择零部件显示改为默认显示,再切换线架图,就会发现整个装配体都能切换为线架图了!...
11.11机器学习_介绍和定义
一、 机器学习介绍与定义 1. 机器学习定义 机器学习(Machine Learning)本质上就是让计算机自己在数据中学习规律,并根据所得到的规律对未来数据进行预测。 机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习(Deep…...
【代码审计】常见漏洞专项审计-业务逻辑漏洞审计
❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x01 漏洞介绍 1、 原理 业务逻辑漏洞是一类特殊的安全漏洞,业务逻辑漏洞属于设计漏洞而非实…...
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
文本溢出通常是指在限定的空间内不能容纳所输入的文字,导致文字超出了容器的边界 一、文本溢出 1.1.css属性处理 所用到的属性 属性属性值overflowvisible:默认值,内容不会被修剪,会呈现在元素框之外。hidden:内容会…...
python程序对服务器cpu和内存资源占用的管理。
背景 在服务器上部署了一套目标检测的程序,做成while true 的轮询检测数据更新的定时任务。 结果没想到那台服务器还有一套可视化程序要给领导演示看,结果演示的时候平台各种报错。 然后通过top查看了一下资源利用率发现python的程序cpu 130。…...
java算法性能调优:详尽探讨时间复杂度与空间复杂度的分析与优化“
接下来我将带领大家进入Java数据结构的深入学习,让我们一同享受Java数据结构中的奥秘。 一、引言 二、时间复杂度 三、空间复杂度 四、Java中的时间复杂度和空间复杂度 五、优化时间复杂度和空间复杂度 七、时间复杂度和空间复杂度的重要性 一:时间…...
人工智能:塑造未来的工作与生活
目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角:人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…...
RK3568笔记六十九: 事件回调处理之Libevent 简单使用
若该文为原创文章,转载请注明原文出处。 一、前言 在项目开发过程中,事件处理使用相当多,特别是在UI处理的过程中,UI不能在非UI程里直接操作,否则会出现内存等异常,即不能在子线程里操作UI,所以用事件消息的方式通知UI线程刷新UI界面,在这一细节上掉了好多次坑。 Lib…...
MySQL如何解决幻读?
目录 一、什么是幻读? 1.1 幻读的定义 1.2 幻读的示例 1.3 幻读产生的原因? 1.4 读已提交(Read Committed) 1.4.1 确定事务等级 1.4.2 非锁定读取 准备 示例 结论 1.4.3 锁定读取 准备 示例 分析 结论 1.5 可重复读…...
Javascript_设计模式(二)
什么是迭代器模式?一般用在什么场景? 迭代器模式是一种行为型设计模式,它用于提供一种顺序访问聚合对象中各个元素的方法,而又不暴露该对象的内部表示。通过使用迭代器模式,可以遍历一个聚合对象,而无需关心该对象的内部结构和…...
时间同步服务器
1、时间同步服务:在多台主机协作时,确保时间同步,防止时间不一致造成的故障。 2、时间按同步实现: ntp 、chrony 3、命令:timedatectl timedatectl set-time "2024-02-13 10:41:55" timedatect…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
