最后
由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
今天我们来讲解字符串问题,字符串问题是比较容易的类型,一般不会使用到复杂的算法。请大家与我一起开始我们的刷题之路吧!!!
字符串压缩
来看题目:
依据题目要求,我们必须编写一个函数,确保它能返回一个更为紧凑的字符数组:若压缩后的字符串长度小于原始字符串,则返回压缩后的字符串;反之,则返回原始字符串。本题的挑战核心在于如何有效地判定压缩是否导致了长度缩减,以及如何妥善地将处理后的数据填充进数组之中。接下来,我们将通过两种策略来攻克这一问题。
思路一(双指针顺畅版)
本思路一步一步操作,逐步完成任务
- 先确认字符串长度是否小于 2 ,小于直接返回(因为压缩字符串长度至少是2)
- 然后定义双指针和计数位
- 开始遍历 : *fast 与 *slow 不相等 则 fast向后移动
- 然后记录重复次数
- 重复次数分位数进入数组
- slow 到 fast 位置 , 计数归零
- 重复 3 - 6 直到遍历结束
char\* compressString(char\* S){
int len1 = strlen(S);
if(len1<=2) return S;
// 双指针
char\* slow = S;
char\* fast = S;
//记录次数 每个字母至少出现 1 次
int count = 1;
//开辟一个足够大的数组空间
char\* ret = (char\*)malloc(sizeof(char) \* 100001);
int i = 0;
//开始遍历
while(\*fast !='\0'){
//快指针 后移
fast = fast + 1;
//向后移动 直到不同
while(\*fast == \*slow){
fast++;
count++;
}
//计算位数 方便下面的赋值操作
int n = 0;
int num = count ;
while(num){
num /=10;
n++;
}
int n2 = n;
// ret 数组赋值
ret[i++] = \*slow;
while(n--) {
ret[i + n] = count % 10 + '0' ;
count /= 10;
}
// 下标后移
i += n2;
// 慢指针移动到快指针位置
slow = fast;
//计数重置
count = 1;
}
//结尾 ‘\0’不能忘记
ret[i] = '\0';
int len2 = strlen(ret);
//返回较小的 字符串
if(len2 < len1) return ret;
else return S;
}
思路二(sprintf函数巧解版)
上一步的写入计数的步骤十分繁琐,而使用sprintf函数可以巧妙化解这个问题
因为输入的数据都是 字符 + 数字
sprintf()
int sprintf ( char * str, const char * format, ... );
将格式化数据写入字符串
该函数将格式化文本组合成一个字符串,其内容与使用printf函数打印时完全一致,但并不直接输出,而是将内容存储在指向str的缓冲区中作为一个C语言风格的字符串。
请注意,缓冲区的大小应足够容纳生成的整个字符串(为了安全性考虑,请参阅snprintf函数获取更安全的版本)。
在内容后面,函数会自动附加一个终止空字符(null terminator)。
在format参数之后,函数期望至少有与format中所需数量相匹配的额外参数。
最后
一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
分享一些前端面试题以及学习路线给大家
c3ab8389e65ecb71ac0)**
分享一些前端面试题以及学习路线给大家
[外链图片转存中…(img-DJg4OybN-1715667018405)]
[外链图片转存中…(img-vJreWNuY-1715667018406)]