字符串处理与基础算法技巧
字符替换:数字转为"number"
给定一个字符串,将其中的数字字符替换为字符串 number,其余字符保持不变。该问题可通过直接遍历输出实现,无需额外数组。
#include <stdio.h>
int main() {
char input[10000];
scanf("%s", input);
int i = 0;
while (input[i] != '\0') {
if (input[i] >= 'a' && input[i] <= 'z') {
printf("%c", input[i]);
} else {
printf("number");
}
i++;
}
return 0;
}
原地构造替换:使用动态内存
若需在新空间中完成替换,先统计原始长度和数字数量,计算目标长度(原长 + 5×数字个数),从后往前填充,避免覆盖。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char source[10000];
scanf("%s", source);
int len = strlen(source);
int digitCount = 0;
for (int i = 0; i < len; i++) {
if (source[i] >= '0' && source[i] <= '9') {
digitCount++;
}
}
int newLen = len + 5 * digitCount;
char* result = (char*)malloc((newLen + 1) * sizeof(char));
strcpy(result, source);
int srcIndex = len - 1;
int dstIndex = newLen - 1;
while (srcIndex >= 0) {
if (result[srcIndex] >= '0' && result[srcIndex] <= '9') {
result[dstIndex--] = 'n';
result[dstIndex--] = 'u';
result[dstIndex--] = 'm';
result[dstIndex--] = 'b';
result[dstIndex--] = 'e';
result[dstIndex--] = 'r';
} else {
result[dstIndex--] = result[srcIndex];
}
srcIndex--;
}
result[newLen] = '\0';
printf("%s\n", result);
free(result);
return 0;
}
字符串反转:双指针法
使用首尾双指针交换字符,逐步向中间移动,实现字符串反转。
void reverseString(char* s, int size) {
int left = 0;
int right = size - 1;
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
每 k 个字符反转:区间翻转策略
每间隔 2k 个字符,反转前 k 个字符。注意最后一段不足 k 时只反转可用部分。
char* reverseStr(char* s, int k) {
int len = strlen(s);
for (int i = 0; i < len; i += 2 * k) {
int end = i + k < len ? i + k : len;
int left = i, right = end - 1;
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
return s;
}
字符串输入方式对比
scanf("%s", buffer);:读取首个非空白字符开始的字符串,以空格或换行结束。fgets(buffer, size, stdin);:读取整行输入,包括空格,适合含空格的字符串。
变量交换的三种方法
实现两个变量值互换:
- 临时变量法:
int temp = a; a = b; b = temp; - 异或交换法(适用于整型):
a ^= b; b ^= a; a ^= b; - 算术运算法(可能溢出):
*a = *a + *b; *b = *a - *b; *a = *a - *b;
