当前位置: 首页 > 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…...

react+hook+vite项目使用eletron打包成桌面应用+可以热更新

使用Hooks-Admin的架构 Hooks-Admin: &#x1f680;&#x1f680;&#x1f680; Hooks Admin&#xff0c;基于 React18、React-Router V6、React-Hooks、Redux、TypeScript、Vite2、Ant-Design 开源的一套后台管理框架。https://gitee.com/HalseySpicy/Hooks-Adminexe桌面应用…...

STM32 ADC --- DMA乒乓缓存

STM32 ADC — DMA乒乓缓存 文章目录 STM32 ADC --- DMA乒乓缓存软件切换实现乒乓利用DMA双缓冲实现乒乓 通过cubeMX配置生成HAL工程这里使用的是上篇文章&#xff08;STM32 ADC — DMA采样&#xff09;中生成的工程配置 软件切换实现乒乓 cubeMX默认生成的工程中是打开DMA中断…...

SpringCloud基础 入门级 学习SpringCloud 超详细(简单通俗易懂)

Spring Cloud 基础入门级学习 超详细&#xff08;简单通俗易懂&#xff09; 一、SpringCloud核心组件第一代&#xff1a;SpringCloud Netflix组件第二代&#xff1a;SpringCloud Alibaba组件SpringCloud原生组件 二、SpringCloud体系架构图三、理解分布式与集群分布式集群 四、…...

【Windows 常用工具系列 20 -- MobaXterm 登录 WSL】

文章目录 MobaXterm 登录 WSL MobaXterm 登录 WSL 在 WSL 启动之后&#xff0c;打开 MobaXterm&#xff1a; 在 Distribution 中选择自己本地安装的 ubuntu 版本&#xff0c;我这里使用的是ubuntu-20.4&#xff0c;然后在 runmethod 中选择 Localhost connection. 连接成功之…...

【vmware+ubuntu16.04】ROS学习_博物馆仿真克隆ROS-Academy-for-Beginners软件包处理依赖报错问题

首先安装git 进入终端&#xff0c;输入sudo apt-get install git 安装后&#xff0c;创建一个工作空间名为tutorial_ws&#xff0c; 输入 mkdir tutorial_ws#创建工作空间 cd tutorial_ws#进入 mkdir src cd src git clone https://github.com/DroidAITech/ROS-Academy-for-Be…...

UniApp的Vue3版本中H5配置代理的最佳方法

UniApp的Vue3版本中H5项目在本地开发时需要配置跨域请求调试 最开始在 manifest.json中配置 总是报404&#xff0c;无法通过代理请求远程的接口并返回404错误。 经过验证在项目根目录创建 vite.config.js文件 vite.config.js内容: // vite.config.js import {defineConfig }…...

深入了解Pod

Pod是Kubernetes中最小的单元,它由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等。 1、Pod 是由一组紧耦合的容器组成的容器组,当然…...

基于Spider异步爬虫框架+JS动态参数逆向+隧道代理+自定义中间件的猎聘招聘数据爬取

在本篇博客中&#xff0c;我们将介绍如何使用 Scrapy 框架结合 JS 逆向技术、代理服务器和自定义中间件&#xff0c;来爬取猎聘网站的招聘数据。猎聘是一个国内知名的招聘平台&#xff0c;提供了大量的企业招聘信息和职位信息。本项目的目标是抓取指定城市的招聘信息&#xff0…...

Spring 中的 BeanDefinitionParserDelegate 和 NamespaceHandler

一、BeanDefinitionParserDelegate Spring在解析xml文件的时候&#xff0c;在遇到<bean>标签的时候&#xff0c;我们会使用BeanDefinitionParserDelegate对象类解析<bean>标签的内容&#xff0c;包括<bean>标签的多个属性&#xff0c;例如 id name class in…...

BERT模型核心组件详解及其实现

摘要 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种基于Transformer架构的预训练模型&#xff0c;在自然语言处理领域取得了显著的成果。本文详细介绍了BERT模型中的几个关键组件及其实现&#xff0c;包括激活函数、变量初始化…...