C语言练习百题之字符串反转

题目:字符串反转,如将字符串 “www.runoob.com” 反转为 “moc.boonur.www”

程序分析

要实现字符串的反转,可以考虑从两端向中间遍历,并交换对应位置上的字符。

方法1:使用临时数组

解题思路

首先,将原始字符串中的字符逐个复制到一个临时数组中,并逆序复制。然后再将临时数组中的字符逐个复制回原始字符串。

实现代码
#include 
#include 

void reverse_string_temp_array(char str[]) {
    int length = strlen(str);
    char temp[length + 1];

    // Copy characters to temporary array in reverse order
    for (int i = 0; i < length; i++) {
        temp[length - i - 1] = str[i];
    }
    
    // Copy characters from temporary array back to original string
    for (int i = 0; i < length; i++) {
        str[i] = temp[i];
    }
}

int main() {
    char str[] = "www.runoob.com";
    printf("Original string: %s\n", str);

    reverse_string_temp_array(str);

    printf("Reversed string: %s\n", str);
    return 0;
}
优缺点
  • 优点:
    • 简单直观,易于实现。
  • 缺点:
    • 需要额外的临时数组,占用额外的空间。

方法2:双指针法

解题思路

使用两个指针,一个指向字符串的起始位置,另一个指向字符串的末尾位置。逐步交换两个指针指向的字符,直到它们相遇。

实现代码
#include 
#include 

void reverse_string_two_pointers(char str[]) {
    int length = strlen(str);
    int start = 0;
    int end = length - 1;

    while (start < end) {
        // Swap characters at start and end positions
        char temp = str[start];
        str[start] = str[end];
        str[end] = temp;

        // Move the pointers towards the center
        start++;
        end--;
    }
}

int main() {
    char str[] = "www.runoob.com";
    printf("Original string: %s\n", str);

    reverse_string_two_pointers(str);

    printf("Reversed string: %s\n", str);
    return 0;
}
优缺点
  • 优点:
    • 无需额外的临时数组,空间复杂度为O(1)。
    • 效率较高,时间复杂度为O(n/2)。
  • 缺点:
    • 相对于临时数组法,代码稍微复杂一些。

方法3:递归法

解题思路

利用递归,将字符串的第一个字符与最后一个字符交换,然后对剩余部分递归地进行反转。

实现代码
#include 
#include 

void reverse_recursive(char str[], int start, int end) {
    if (start >= end)
        return;

    // Swap characters at start and end positions
    char temp = str[start];
    str[start] = str[end];
    str[end] = temp;

    // Recur for the rest of the string
    reverse_recursive(str, start + 1, end - 1);
}

void reverse_string_recursive(char str[]) {
    int length = strlen(str);
    reverse_recursive(str, 0, length - 1);
}

int main() {
    char str[] = "www.runoob.com";
    printf("Original string: %s\n", str);

    reverse_string_recursive(str);

    printf("Reversed string: %s\n", str);
    return 0;
}
优缺点
  • 优点:
    • 无需额外的临时数组,空间复杂度为O(1)。
    • 使用递归,代码简洁。
  • 缺点:
    • 可能会导致堆栈溢出,特别是对于较长的字符串。

总结与推荐

  • 方法1(临时数组)虽然简单直观,但需要额外的临时数组,空间复杂度较高,不推荐。
  • 方法2(双指针法)是较为常用的实现方式,无需额外空间,且效率较高,是推荐的方法。
  • 方法3(递归法)虽然代码简洁,但可能导致堆栈溢出,对于较长的字符串不适用,不推荐。

推荐使用方法2(双指针法)作为最优方法,特别适用于大字符串的反转,不需要额外的空间,效率较高。

你可能感兴趣的:(C语言练习百题,c语言,算法,开发语言)