Leetcode解题笔记(string)

344.Reverse String

Write a function that takes a string as input and returns the string reversed.

Example:
Given s = “hello”, return “olleh”.

题意:给出字符串,将其反转,写出这样的函数。函数定义如下:

char* reverseString(char* s) {
}

此题是典型的双指针算法的应用,首尾各放置一个指针,由两头向中间遍历,将最后一位到第一位的各个字符放进新数组即可。
此处需要注意的是,由于函数返回的是一个指针类型,如果我们直接将函数内部声明的新数组返回,程序将出现错误,因为指针作为局部变量,在函数返回之后就会消失,此时主程序便无法获得正确的结果,所以我们要用strcpy函数将字符串复制进参数中的字符串s中去。

思路就是这样,代码如下:

char* reverseString(char* s) {
    int sl=strlen(s);
    char r[sl+1];/*+1以容纳字符串结尾的'\0'*/
    int i;
    for(i=0;i<sl;i++){
        r[sl-i-1]=*(s+i);
    }
    r[i]='\0';
    strcpy(s,r);
    return s;
}

345.Reverse Vowels of a String
Write a function that takes a string as input and reverse only the vowels of a string.

Example 1:
Given s = “hello”, return “holle”.

Example 2:
Given s = “leetcode”, return “leotcede”.

题目大意:将一个字符串中的元音字母倒序排列,其余字母顺序不变,具体请见Example,函数定义如下:

char* reverseVowels(char* s) {
}

还是双指针问题,声明两个指针itfwd和itbwd,分别指向首尾。当itfwd小于itbwd时,进行循环,如果两个指针都指向元音字母,那么两个字母交换位置。如果一个指向元音一个为辅音,则将指向辅音的指针向前或向后移动,直到都指向元音进行交换。
后来又想了想,感觉有优化的空间,如果判断出这个字符串里的元音字母少于两个,则直接返回原字符串即可,省去了一些判断。代码如下:

int isVowel(char c){/*用于判断是否为元音字母*/
    return 
    c == 'a' || c == 'A' ||
    c == 'e' || c == 'E' ||
    c == 'i' || c == 'I' ||
    c == 'o' || c == 'O' ||
    c == 'u' || c == 'U';
}
/*定义交换函数*/
void charswp(char *a,char *b){
    char tmp=*a;
    *a=*b;
    *b=tmp;
}

char* reverseVowels(char* s) {
    int len=strlen(s);
    if(len<2)
        return s;
    int itfwd=0,itbwd=len-1;
    while(itfwd<itbwd){
        if(isVowel(s[itfwd])&&isVowel(s[itbwd])){
            charswp(&s[itfwd],&s[itbwd]);
            ++itfwd;
            --itbwd;
        }
        while(!isVowel(s[itfwd])&&itfwd<=len-1)
            ++itfwd;
        while(!isVowel(s[itbwd])&&itbwd>=0)
            --itbwd;
    } 
    return s;
}

持续更新中……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值