344.反转字符串
题目链接/文章讲解/视频讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html
思路
常规简单题
void reverseString(char* s, int sSize){
int left = 0;
int right = sSize - 1;
while(left < right) {
char temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
学习反思
比较基础的题目,单纯的交换数值。
541. 反转字符串II
题目链接/文章讲解/视频讲解:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html
思路
char * reverseStr(char * s, int k){
int len = strlen(s);
for (int i = 0; i < len; i += (2 * k)) {
k = i + k > len ? len - i : k;
int left = i;
int right = i + k - 1;
while (left < right) {
char temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
return s;
}
学习反思
比起上一题来说,这个题考虑的更多,但大体思路差不多,在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间就可以了。
卡码网:54.替换数字
题目链接/文章讲解:https://programmercarl.com/kama54.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html
思路
先计算替换后字符串的总长度,然后使用一个临时数组来存储替换后的结果,最后将临时数组的内容复制回原数组。好处是代码相对简单易懂,而且不需要担心在原数组上进行操作时可能导致的覆盖问题。然而,使用了一个额外的临时数组,这可能会增加一些内存开销(尽管在这个特定情况下,由于已经为输入字符串分配了一个足够大的数组,所以临时数组的大小也是可控的)。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
void replaceDigitsWithNumberInPlace(char *s);
int main() {
char s[100000];
if (scanf("%99999s", s) != 1) {
fprintf(stderr, "Error reading input.\n");
return 1;
}
replaceDigitsWithNumberInPlace(s);
printf("%s\n", s);
return 0;
}
void replaceDigitsWithNumberInPlace(char *s) {
int len = strlen(s);
const int numberLen = strlen("number");
int newLen = len;
char temp[100000];
int j = 0;
for (int i = 0; i < len; i++) {
if (isdigit(s[i])) {
strcpy(temp + j, "number");
j += numberLen;
} else {
temp[j++] = s[i];
}
}
strcpy(s, temp);
}
首先扩充数组到每个数字字符替换成 "number" 之后的大小。例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。然后从后向前替换数字字符,也就是双指针法,很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。这么做的好处:不用申请新数组。从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
void replaceDigitsWithNumber(char *s) {
int len = strlen(s);
int newLen = 0;
for (int i = 0; i < len; i++) {
if (isdigit(s[i])) {
newLen += strlen("number");
} else {
newLen++;
}
}
char *result = (char *)malloc(newLen + 1);
if (!result) {
printf("内存分配失败!\n");
return;
}
int resultIndex = 0;
for (int i = 0; i < len; i++) {
if (isdigit(s[i])) {
strcpy(&result[resultIndex], "number");
resultIndex += strlen("number");
} else {
result[resultIndex++] = s[i];
}
}
result[resultIndex] = '\0';
printf("%s\n", result);
free(result);
}
int main() {
char s[10000];
scanf("%9999s", s);
replaceDigitsWithNumber(s);
return 0;
}
学习反思
c语言库库就是越界,写了好久
总结
今天发现c语言好难写,指针数组库库越界,但是最后写出来了,加油!!!