C语言编程题思路汇总(字符串,数组相关)

发布于:2025-02-10 ⋅ 阅读:(33) ⋅ 点赞:(0)

交换两个变量的值(不用第三个变量)

//假设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;  // 返回变形后的字符串
}


网站公告

今日签到

点亮在社区的每一天
去签到