《C语言入门100例》(第14例)给定一个字符串,对它进行翻转输出 | 两个思路

【第14题】给定一个字符串,对它进行翻转输出 | 两个思路

主要知识点

对字符串的操作非常重要,应该熟练掌握。

习题

1. Leetcode 344. 反转字符串

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

初见

从头搜索,将前半部分字符与后半部分字符按顺序进行交换即可。

代码
class Solution {
public:
    void reverseString(vector<char>& s) {
        char tmp;
        for (int i = 0; i < s.size() / 2; ++i) {
            tmp = s[i];
            s[i] = s[s.size() - 1 - i];
            s[s.size() - 1 - i] = tmp;
        }
    }
};

2. Leetcode 345. 反转字符串中的元音字母

题目描述

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现。

初见

借用双指针的思想,要调换单词中所有元音字母的顺序,只需要首位配对找到相应元音字母位置即可。因此令 i 从头开始,j 从尾开始寻找元音,找到后进行调换,直至 i >= j,表明已交换单词中的所有元音字母。

代码
class Solution {
public:
    string reverseVowels(string s) {
        for (int i = 0, j = s.size() - 1; i < j;) {
            while (tolower(s[i]) != 'a' && tolower(s[i]) != 'e' &&
                   tolower(s[i]) != 'i' && tolower(s[i]) != 'o' &&
                   tolower(s[i]) != 'u' && i < j) {
                ++i;
            }

            while (tolower(s[j]) != 'a' && tolower(s[j]) != 'e' &&
                   tolower(s[j]) != 'i' && tolower(s[j]) != 'o' &&
                   tolower(s[j]) != 'u' && i < j) {
                --j;
            }

            char tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
            ++i;
            --j;
        }

        return s;
    }
};

3. Leetcode 2000. 反转单词前缀

题目描述

给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。如果 word 中不存在字符 ch ,则无需进行任何操作。
例如,如果 word = “abcdefd” 且 ch = “d” ,那么你应该 反转 从下标 0 开始、直到下标 3 结束(含下标 3 )。结果字符串将会是 “dcbaefd” 。
返回 结果字符串 。

初见

与上一题类似,找到字符 ch 第一次出现的下标 i 后,按下标反转字符串中 0-i 的字符即可。

代码
class Solution {
public:
    string reversePrefix(string word, char ch) {
        for (int i = 0; i < word.size(); ++i) {
            if (word[i] == ch) {
                for (int j = 0; j <= i / 2; j++) {
                    char tmp = word[j];
                    word[j] = word[i - j];
                    word[i - j] = tmp;
                }
                break;
            }
        }

        return word;
    }
};

总结

  1. 第一点
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是用 C 语言实现的代码: ```c #include <stdio.h> #include <string.h> // 翻转每个单词中的字符 void reverse(char *begin, char *end) { while (begin < end) { char temp = *begin; *begin++ = *end; *end-- = temp; } } // 翻转整个字符串 void reverseWords(char *s) { int len = strlen(s); // 去除字符串两端的多余空格 int i = 0, j = len - 1; while (i <= j && s[i] == ' ') i++; while (i <= j && s[j] == ' ') j--; len = j - i + 1; s += i; // 翻转每个单词 char *word_begin = s; for (char *p = s; p < s + len; p++) { if (*p == ' ') { reverse(word_begin, p - 1); word_begin = p + 1; } } reverse(word_begin, s + len - 1); // 翻转整个字符串 reverse(s, s + len - 1); // 去除多余的空格 int k = 0; for (i = 0; i < len; i++) { if (s[i] != ' ' || (i > 0 && s[i - 1] != ' ')) { s[k++] = s[i]; } } s[k] = '\0'; } int main() { char s[50010]; while (fgets(s, sizeof(s), stdin) != NULL) { reverseWords(s); printf("%s", s); } return 0; } ``` 这里使用了两个辅助函数 `reverse` 和 `reverseWords` 来实现翻转操作。其中,`reverse` 函数用于翻转每个单词中的字符,`reverseWords` 函数则用于翻转整个字符串。 在 `reverseWords` 函数中,先去除字符串两端的多余空格,然后按照空格分割字符串,并翻转每个单词中的字符。接着,再次翻转整个字符串,最后去除多余的空格即可。 在 `main` 函数中,使用 `fgets` 函数逐行读入输入,调用 `reverseWords` 函数进行翻转操作,然后输出结果。 需要注意的是,在 C 语言中,字符串必须以空字符 `\0` 结尾。在对字符串进行操作时,需要保证不越界。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值