高薪算法+计算机职称考试LeetCodeSwift in LeetCode

LeetCode 917. 仅仅反转字母 Reverse Onl

2019-08-12  本文已影响4人  1江春水

【题目描述】
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。

【示例1】

输入:"ab-cd"
输出:"dc-ba"

【示例2】

输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"

【示例3】

输入:"Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"

【思路】
1、使用双指针 left right
2、如果字符在 a-z A-Z之间,那么交换字符
3、如果s[left]不在字母区间,left++向后移位
4、如果s[right]不在字母区间,right--向前移位
5、时间复杂度O(n)
6、空间复杂度O(n)

Swift代码实现:

func reverseOnlyLetters(_ S: String) -> String {
    var chaArr = Array.init(S)
    var left = 0
    var right = chaArr.count-1
    while left < right {
        let cL = chaArr[left]
        let cR = chaArr[right]
        var valueL = uint.init()
        var valueR = uint.init()
        for c in cL.unicodeScalars {
            valueL = c.value
        }
        for cc in cR.unicodeScalars {
            valueR = cc.value
        }
        if !((valueL >= 65 && valueL <= 90) || (valueL >= 97 && valueL <= 122)) {
            left+=1
            continue
        }

        if !((valueR >= 65 && valueR <= 90) || (valueR >= 97 && valueR <= 122)) {
            right-=1
            continue
        }
        //交换
        let tmp = chaArr[left]
        chaArr[left] = chaArr[right]
        chaArr[right] = tmp
        left+=1
        right-=1
    }
    return String.init(chaArr)
}

C语言实现:

char * reverseOnlyLetters(char * S){
    int left = 0;
    int right = strlen(S)-1;
    while (left < right) {
        bool l = (S[left] >= 'a' && S[left] <= 'z') || (S[left] >= 'A' && S[left] <= 'Z');
        bool r = (S[right] >= 'a' && S[right] <= 'z') || (S[right] >= 'A' && S[right] <= 'Z');
        if (l && r) {
            char tmp = S[left];
            S[left] = S[right];
            S[right] = tmp;
            left++;
            right--;
            continue;
        }
        if (!l) {
            left++;
        }
        if (!r) {
            right--;
        }
    }
    return S;
}
上一篇下一篇

猜你喜欢

热点阅读