C语言编程题思路汇总(字符串,数组相关)
交换两个变量的值(不用第三个变量)
//假设a = 2, b = 3。现在要交互a和b的值
int a = 2;
int b = 3;
a = a + b;
b = a - b;//b = a + b - b ,所以b = a
a = a - b;//a = a + b - a ,所以a = b
双指针
反转字符串
大致思路:双指针+首尾两个数据依次进行交换。
p1指针指向尾部。p2指针指向首部。*p1 和 *p2两两交换后,p1指针-1,p2指针+1,因为前后同时开始,所以只需len/2次即可。
代码:
#include <string.h>
char* solve(char* str ) {
// write code here
int i, len; // 声明两个整型变量,用于循环计数和存储字符串长度
char *p1 = NULL; // 声明指针 p1,初始化为 NULL
char *p2 = NULL; // 声明指针 p2,初始化为 NULL
len = strlen(str); // 获取字符串的长度
p1 = &str[len-1]; // p1 指向字符串的最后一个字符
p2 = str; // p2 指向字符串的第一个字符
for(i = 0; i < len / 2; i++) // 遍历字符串的一半长度
{
*p1 = *p1 + *p2; // 交换 p1 和 p2 指向的字符
*p2 = *p1 - *p2;
*p1 = *p1 - *p2;
p1--; // p1 向前移动一位
p2++; // p2 向后移动一位
}
return str; // 返回反转后的字符串
}
回文串判断
大致思路:
利用双指针,p1指向字符串的首部,p2指向字符串的末尾。循环len/2次判断 *p1++ != *p2-- 。
#include <string.h>
bool judge(char* str ) {
// write code here
int len; // 声明一个整型变量,用于存储字符串的长度
len = strlen(str); // 使用 strlen 函数获取字符串的长度
char *p1 = str; // 声明指针 p1,并初始化为指向字符串的起始位置
char *p2 = &str[len-1]; // 声明指针 p2,并初始化为指向字符串的最后一个字符
int i = 0; // 声明一个整型变量 i,用于循环计数
/* 使用for循环 */
/*
for(i=0;i<len/2;i++)
{
if( *p1++ != *p2-- )
{
return false; // 如果 p1 和 p2 指向的字符不相等,返回 false
}
}
*/
/* 使用while循环 */
while(i<len/2) // 当 i 小于字符串长度的一半时,继续循环
{
if( *p1++ != *p2-- ) // 如果 p1 和 p2 指向的字符不相等
{
return false; // 返回 false
}
i++; // 增加计数器 i
}
return true; // 如果所有对应字符都相等,返回 true
}
字符串
字符串变形
// 反转函数
void reverse(char* s, int head, int tail) {
while (head < tail) { // 当头指针小于尾指针时,继续交换
s[head] = s[head] + s[tail]; // 交换 s[head] 和 s[tail] 的值
s[tail] = s[head] - s[tail];
s[head] = s[head] - s[tail];
head++; // 头指针向后移动
tail--; // 尾指针向前移动
}
}
// 主函数
char* trans(char* s, int n) {
// 翻转整个字符串
reverse(s, 0, n - 1); // 调用反转函数,反转整个字符串
int i = 0, j = 0; // 声明两个整型变量,用于遍历字符串
while (i < n) { // 遍历整个字符串
j = i; // j 初始化为 i 的值
// 按照空格分段进行大小写切换,部分反转
while (j < n && s[j] != ' ') { // 找到当前单词的末尾
// 切换大小写
if (s[j] >= 'A' && s[j] <= 'Z') { // 如果是大写字母
s[j] += 32; // 转换为小写字母
} else if (s[j] >= 'a' && s[j] <= 'z') { // 如果是小写字母
s[j] -= 32; // 转换为大写字母
}
j++; // j 向后移动
}
// 把这一段翻转
reverse(s, i, j - 1); // 调用反转函数,反转当前单词
i = j + 1; // i 移动到下一个单词的起始位置
}
return s; // 返回变形后的字符串
}