力扣LCR182:字符串操作三连 从基础拼接到底层指针优化
题目重解
需要将密码字符串从第target个字符开始进行重新排列,形成新的动态密码。例如输入"password"和target=3,结果应为"swordpas"。
解题思路
1.基础拼接法(注释部分):创建新字符串,分两次遍历拼接
3.最终方案:通过字符串扩容和指针操作实现原地修改,通过resize扩容后,使用指针直接操作内存,避免了额外的字符串拷贝,最优的空间优化方案。
代码:
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; // 返回新字符串 } };
原创内容 转载请注明出处