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. 这些数据结构由操作系统内核管理,用于控制进程的执行和访问资源。

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

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

感谢大家的三连支持!

相关推荐
十五年专注C++开发几秒前
Oat++: 一个轻量级、高性能、零依赖的 C++ Web 框架
开发语言·c++·web服务·oatpp
Fcy6489 分钟前
算法基础详解(六)倍增思想与离散化思想
算法·快速幂·离散化·倍增算法
wuweijianlove24 分钟前
算法调度问题中的代价模型与优化方法的技术5
算法
Dxy123931021629 分钟前
Python路径算法简介
开发语言·python·算法
And_Ii1 小时前
LCR 132.砍竹子Ⅱ
算法
汀、人工智能1 小时前
[特殊字符] 第67课:跳跃游戏II
数据结构·算法·数据库架构·图论·bfs·跳跃游戏ii
John_ToDebug1 小时前
惰性绑定 vs 立即注入:Chromium 扩展 API 初始化策略深度对比
c++·chrome·v8
快乐的划水a1 小时前
c++计时器类
c++
Little At Air1 小时前
LeetCode 30. 串联所有单词的子串 | 困难 C++实现
算法·leetcode·职场和发展