剑指offer 学习笔记 字符串
C/C++中每个字符串以字符’\0’结尾,有时容易出错:
char str[10];
strcpy(str, "0123456789"); // 出错
为了节省内存,C/C++常把常量字符串放到单独的一个内存区域。当几个指针指向相同的常量字符串时,他们实际会指向相同的内存地址:
char str1[] = "hello world";
char str2[] = "hello world";
if (str1 == str2); // false
const char *str3 = "hello world";
const char *str4 = "hello world";
if (str3 == str4); // true
面试题5:替换空格。请实现一个函数,把字符串中的每个空格替换成"%20"。
字符串中的一个空格被替换为三个字符,因此结果原字符串会变长,若原字符串后还有空间,可以在原串上修改,否则要重新声明一个新字符串保存。以下方法使用在原来字符串上替换的方式。
方法一:从头到尾扫描字符串,遇到空格时把一个空格替换成三个字符,这就需要把空格后面的字符向后移动两字节。假设每个字符的长度是n,对每个空格字符而言,需要移动后面O(n)个字符,因此对于含有O(n)个空格字符的字符串,总时间复杂度为O(n²)。显然这个方法时间复杂度太高。
方法二:我们可以先遍历一遍字符串,统计出字符串中空格的总数,由此计算出替换之后的字符串的总长度。我们从字符串的后面开始复制和替换,首先准备两个指针P1和P2,P1指向原始串的末尾,而P2指向替换之后的字符串的末尾。接下来我们向前移动P1,逐个把它指向的字符复制到P2指向的位置,同时向前移动P2,直到碰到第一个空格,遇到空格之后,把P1向前移动一格,在P2之前插入字符"%20",同时将P2向前移动三格,之后继续以上步骤直到P1和P2指向同一位置。此方法所有字符都只移动一次,时间效率为O(n):
#include <iostream>
using namespace std;
bool solution(char c[], int length) { // length为数组c的长度
if (c == nullptr || length < 0) {
return false;
}
int newLength = 0, oldLength = 0;
char* cp = c;
while (*cp != '\0') {
if (*cp == ' ') {
newLength += 3;
++oldLength;;
} else {
++newLength;
++oldLength;
}
++cp;
}
if (newLength > length) { // 若变化后的字符串长度大于数组长度
return false;
}
int oldIndex = oldLength - 1, newIndex = newLength - 1;
while (oldIndex != newIndex) {
if (c[oldIndex] == ' ') {
c[newIndex--] = '0';
c[newIndex--] = '2';
c[newIndex--] = '%';
} else {
c[newIndex--] = c[oldIndex];
}
--oldIndex;
}
return true;
}
int main() {
char c[20] = "1 2 3";
solution(c, 20);
cout << c << endl;
return 0;
}
相关题目:有两个排序的数组A1和A2,内存在A1的末尾有足够的多余空间容纳A2。请实现一个函数,把A2中的所有数字插入A1中,并且所有数字都是排序的。
和前面例题一样,很多人首先想到在A1中从头到尾排序数字,但这样会出现一个数字被移动多次的情况,更好的办法是从尾到头比较A1和A2中的数字,并把较大的数字复制到A1中的合适位置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)