345-简单-反转字符串中的元音字母

在这里插入图片描述
方法一:创建一个数组保存所有元音字符下标,然后交换,时间复杂度O(n),费内存

char* reverseVowels(char* s) {
	int len = strlen(s);
	int j = 0;
	int *subcript = (int*)malloc(len*sizeof(int));
	for (int i = 0; i < len; i++){
		switch (s[i]) {
		case 'a':
		case 'i':
		case 'o':
		case 'e':
		case 'u':
        case 'A':
		case 'I':
		case 'O':
		case 'E':
		case 'U':
			subcript[j++] = i;
			break;
		default:
			break;
		}
	}
	for (int i = 0; i < (j>>1); i++){
		s[subcript[i]] ^= s[subcript[j-1-i]];
		s[subcript[j - 1 - i]] ^= s[subcript[i]];
		s[subcript[i]] ^= s[subcript[j - 1 - i]];

	}
	free(subcript);
	return s;
}

方法二 双指针法

int is_vowel(char _s)
{
    printf("_s = %c\r\n",_s);
	switch (_s) {
	case 'a':
	case 'i':
	case 'o':
	case 'e':
	case 'u':
	case 'A':
	case 'I':
	case 'O':
	case 'E':
	case 'U':
		return 0;
		break;
	default:
		break;
	}
	return 1;
}
char* reverseVowels(char* s) {
	int i = 0;
	int j = strlen(s);
    j--;
	while (i < j){
		while ((i < j) && (1 == is_vowel(s[i]))) {
			i++;
		}
		while ((i < j) && (1 == is_vowel(s[j]))) {
			j--;
		}
		if (i >= j) {
			break;
		}
		s[i] ^= s[j];
		s[j] ^= s[i];
		s[i] ^= s[j];
		i++;
		j--;
	}
	return s;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值