[题解]《C语言入门100例》(第14例) 字符串翻转

概念定义

  字符反转就是将一个字符串翻转过来,通常我们都是分别从首位同时进行调换,或则重新定义一个字符数组,将原本的字符串从尾部一一赋值给新串。
代码如下:

#include <stdio.h>

void Reserved(char* s, int sSize){
	int left = 0, right = sSize - 1;
	while (left < right){
		char tmp = s[left];
		s[left] = s[right];
		s[right] = tmp;
		left++; right--;
	}
}

int main(){
	char str[] = "abcdefg";
	Reserved(str, strlen(str));
	printf("%s\n", str);//输出结果gfedcba
	return 0;
}

二. 课后习题

2.1 反转字符串

题目链接:
344. 反转字符串
这道题很简单就不细讲了,左右两边对调,并且同时向中间靠近。
代码如下:

void reverseString(char* s, int sSize){
    int l = 0;
    int r = sSize - 1;
    while(l < r){
        char tmp = s[l];
        s[l] = s[r];
        s[r] = tmp;
        l++;r--;
    }
}

2.2. 反转单词前缀

题目链接:
2000. 反转单词前缀
思路分析:
  首先我们给找到它所给字母第一次出现的位置,然后再根据字符串反转的方法,将前缀反转即可。
  此外我们还需考虑特殊情况,就是所给的字母没有出现,那我们无需反转。
代码如下:

char * reversePrefix(char * word, char ch){
    int r;
    int n = strlen(word);
    for(int i = 0; i < n; i++){
        //寻找ch的下标
        if(word[i] == ch){
            r = i;break;
        }
        //如果没有则直接返回原串
        if(i == (n - 1)){
           return word; 
        }
    }
    int l = 0;
    //反转前缀
    while(l < r){
        char tmp = word[l];
        word[l] = word[r];
        word[r] = tmp;
        l++;r--;
    }
    return word;
}

2.3 反转字符串中的元音字母

题目链接:
345. 反转字符串中的元音字母
思路分析:
  这道题只需要我们反转元音字母,所以我们要做的第一步就是将所有的元音字母记录下来,那么剩下的步骤就是将他们调转即可。
代码如下:

//判断元音字母
bool isVowels(char s){
    if(s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u'){
        return true;
    }
    if(s == 'A' || s == 'E' || s == 'I' || s == 'O' || s == 'U'){
        return true;
    }
    return false;
}

char * reverseVowels(char * s){
    int n = strlen(s);
    int Vowels[n];
    int Vsize = 0;
    //记录元音字母的下标
    for(int i = 0; i < n; i++){
        if(isVowels(s[i])){
            Vowels[Vsize++] = i;
        }
    }
    int l = 0, r = Vsize - 1;
    //调换元音字母
    while(l < r){
        char tmp = s[Vowels[l]];
        s[Vowels[l]] = s[Vowels[r]];
        s[Vowels[r]] = tmp;
        l++;r--;
    }
    return s;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友人苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值