2.1 - 反转字符串中的单词 && 每个进程的内存里包含什么

目录

1.反转字符串中的单词

a.核心思想

b.思路

c.步骤

2.每个进程的内存里包含什么


1.反转字符串中的单词

151. 反转字符串中的单词 - 力扣(LeetCode)https://leetcode.cn/problems/reverse-words-in-a-string/

cpp 复制代码
class Solution {
public:
    string reverseWords(string s) {
        vector<string> words;
        stringstream ss(s);
        string word;

        while (ss >> word) 
        {
            words.push_back(word);
        }

        reverse(words.begin(), words.end());
        string result;

        for (size_t i = 0; i < words.size(); ++i)
        {
            result += words[i];
            if (i < words.size() - 1) 
                result += " ";
        }
        return result;
    }
};

a.核心思想

先将字符串按单词分割成多个子串,然后将这些子串逆序,最后将逆序后的子串用单个空格连接起来。

b.思路

① 使用字符串流或者手动遍历字符串的方式提取出每个单词。

② 将提取出的单词存储在一个容器(如 vector)中。

③ 逆序该容器中的单词。

④ 使用空格将逆序后的单词连接成一个新的字符串。

c.步骤

① 初始化一个空的 vector 用于存储单词。

② 遍历字符串,跳过前导空格,找到单词的起始位置。

③ 逐个读取字符,直到遇到空格,将读取到的单词存入 vector

④ 继续跳过空格,重复步骤 3 直到字符串结束。

⑤ 逆序 vector 中的单词。

⑥ 使用空格将逆序后的单词连接成字符串并返回。

2.每个进程的内存里包含什么

每个进程的内存(即进程的地址空间)通常包含多个不同的区域(或称为段),每个区域存储特定类型的数据或代码。以下是进程内存的主要组成部分及其概括:

  1. 代码段(Text Segment):

    1. 存储程序的可执行指令(即机器代码)。

    2. 通常是只读的,以防止程序意外修改自己的指令。

    3. 在进程的整个生命周期内保持不变。

  2. 数据段(Data Segment):

    1. 存储全局变量和静态变量。

    2. 可以进一步分为初始化数据段(.data)和未初始化数据段(.bss)。

    3. 初始化数据段包含在程序编译时已初始化的全局和静态变量。

    4. 未初始化数据段包含在程序编译时未初始化的全局和静态变量,通常在程序启动时被初始化为零。

  3. 堆( Heap ):

    1. 动态分配的内存区域,用于存储在程序运行时动态分配的数据。

    2. 程序员通过调用如 malloc(在C中)或 new(在C++中)等函数来从堆中分配内存。

    3. 堆的大小在进程的生命周期内可以动态增长或缩小。

  4. 栈(Stack):

    1. 用于存储函数的局部变量、函数参数、返回地址以及调用链信息。

    2. 栈是一个后进先出(LIFO)的数据结构。

    3. 每当函数被调用时,一个新的栈帧(stack frame)被压入栈顶,包含该函数的局部变量和参数。

    4. 当函数返回时,其栈帧被弹出栈顶。

  5. 共享库 内存映射 (Memory Mapping Segment):

    1. 存储共享库(如动态链接库或共享对象)的代码和数据。

    2. 允许多个进程共享同一份库代码,节省内存。

  6. 内核结构(Kernel Data Structures,不在用户空间中):

    1. 虽然严格来说不属于进程的用户空间内存,但进程在内核空间中也有相关的数据结构,如进程描述符(process descriptor)、页表(page tables)等。

    2. 这些数据结构由操作系统内核管理,用于控制进程的执行和访问资源。

概括来说,进程的内存包含代码、数据、动态分配的内存(堆)、函数调用信息(栈)、共享库以及相关的内核数据结构。这些区域共同支持进程的执行和资源管理。

希望这些内容对大家有所帮助!

感谢大家的三连支持!

相关推荐
luj_176827 分钟前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
取地址符37 分钟前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
tmlx3I0811 小时前
高光谱拼接算法(六)RANSAC 误匹配剔除
人工智能·算法·机器学习
不相心 -w-1 小时前
基础-滑动窗口-(定长 | 不定长)
算法
思麟呀1 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++
醉城夜风~1 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
ysa0510301 小时前
【板子】ST表
c++·笔记·算法·板子
CHHH_HHH2 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
hurrycry_小亦2 小时前
洛谷题目:P1215 [USACO1.4] 母亲的牛奶 Mother‘s Milk 题解(本题简)
算法
十五年专注C++开发2 小时前
fatal error C1189: #error: WinSock.h has already been included 的解决方案
c++·socket·boost