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

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

7个月前 (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; // 返回新字符串
    }
};



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣53题:贪心策略与动态规划的完美联姻 三行代码映射算法精髓

力扣53题:贪心策略与动态规划的完美联姻 三行代码映射算法精髓

题目理解在数字的海洋中寻找最具价值的珍珠链:当我们面对一个可能包含正负数的数组时,寻找连续子数组的和最大值就像在波动的股票曲线中捕捉最佳投资时段。问题的核心在于如何处理可能降低总和的负值元素——是忍痛...

力扣35:二分法在搜索插入位置中的运用

力扣35:二分法在搜索插入位置中的运用

有序数组的定位在一个严格递增的数字序列中,每个元素都有其确定的位置。当新元素试图加入时,我们需要回答两个问题:它是否已经存在?如果不存在,它应该插入在哪里?这道题要求我们在O(log n)时间内完成这...

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

内容简介本文详细解析了力扣第44题"寻找两个正序数组的中位数"的合并排序解法。通过双指针技术合并两个有序数组,然后直接计算合并后数组的中位数。虽然时间复杂度为O(m+n),但这种方...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

一、题目解读牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘...

LeetCode 537题解:复数乘法的C++高效实现与代码解析

LeetCode 537题解:复数乘法的C++高效实现与代码解析

一、题目解读LeetCode 537题要求实现两个复数的乘法,输入为形如"a+bi"的字符串,需输出乘积的复数形式。题目核心在于解析字符串中的实部与虚部,并应用复数乘法公式计算结果...

发表评论

访客

看不清,换一张

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