当前位置:首页 > 力扣 > 力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

3个月前 (05-15)

题目重解

需要将密码字符串从第target个字符开始进行重新排列,形成新的动态密码。例如输入"password"和target=3,结果应为"swordpas"。


解题思路

1.基础拼接法(注释部分):创建新字符串,分两次遍历拼接

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化 力扣 C++ 算法 字符串 指针 第1张

2.指针优化法(注释部分):利用指针直接获取子串

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化 力扣 C++ 算法 字符串 指针 第2张

3.最终方案:通过字符串扩容和指针操作实现原地修改,通过resize扩容后,使用指针直接操作内存,避免了额外的字符串拷贝,最优的空间优化方案。

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化 力扣 C++ 算法 字符串 指针 第3张

代码:

class Solution {
public:
    string dynamicPassword(string password, int target) {
        /* 方案1:基础拼接法
        string s = ""; // 创建空字符串
        // 先拼接target之后的部分
        for (int i = target; i < password.size(); i++) {
            s += password[i]; // 逐个字符追加
        }
        // 再拼接target之前的部分
        for (int i = 0; i < target; i++) {
            s += password[i]; // 逐个字符追加
        }
        return s; // 返回拼接结果
        */

        /* 方案2:指针优化法
        string s = ""; // 创建空字符串
        char* s1 = &password[target]; // 获取target位置指针
        s = s1; // 直接赋值后半部分
        // 拼接前半部分
        for (int i = 0; i < target; i++) {
            s += password[i]; // 逐个字符追加
        }
        return s; // 返回结果
        */

        // 方案3:原地修改法
        int a=password.size(); // 获取原长度
        password.resize(a+target); // 扩容字符串
        char* s1 = &password[target]; // 定位分割点
        char* s2 = s1; // 保存结果起始位置
        s1 += a-target; // 定位到扩容区域
        // 将前target字符移到扩容区
        for (int i = 0; i < target; i++) {
            *s1 = password[i]; // 直接内存操作
            s1++;
        }
        return s2; // 返回新字符串
    }
};



原创内容 转载请注明出处

分享给朋友:

相关文章

线性遍历+二进制 6行代码征服二进制链表转整数

线性遍历+二进制 6行代码征服二进制链表转整数

力扣1290.二进制链表转整数题目本质给定一个单链表的头节点head,链表中每个节点的值为0或1。链表表示一个‌最高有效位在前‌的二进制数字,要求将其转换为对应的十进制整数。例如链表1→0→1对应的二...

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

力扣965题深度解析:单值二叉树的判断技巧

力扣965题深度解析:单值二叉树的判断技巧

重新解读题目 判断一棵二叉树是否为“单值二叉树”,即所有节点的值是否完全相同。题目看似简单,实则考验对树结构递归特性的理解。若一棵树的所有节点值相同,其必然满足:根节点与左右子树的值一致,且...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。