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

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

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



原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

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

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

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

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

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

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

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

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

一、题目解读洛谷P2190题要求解决铁路售票系统中的车厢数量计算问题。题目给定n个车站和m条订票申请,每条申请包含区间[x,y)及乘客数z。需要计算在不超载的情况下(每节车厢最多36人),满足所有乘客...

发表评论

访客

看不清,换一张

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