[每日一题]19:反转字符串多题汇总


反转字符串

题目描述:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

题解如下:

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

反转字符串中的元音字母

题目描述:

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

示例 1:

输入: “hello”
输出: “holle”

题解如下:

class Solution {
    bool isVowel(char ch){
        return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u'
             ||ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U';
    }
public:
    string reverseVowels(string s) {
        int begin = 0;
        int end = s.size() - 1;

        while(begin < end){
            while(begin != end){
                if(isVowel(s[begin]))
                    break;

                ++begin;
            }
            while(begin != end){
                if(isVowel(s[end]))
                    break;

                --end;
            }
             if(begin < end){
                 swap(s[begin], s[end]);
                 
                 ++begin;
                 --end;
             }
        }

        return s;
    }
};

反转字符串 II

题目描述:

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”

要求:
该字符串只包含小写的英文字母。
给定字符串的长度和 k 在[1, 10000]范围内。

题解如下:

class Solution {
    void reverse(string& s, int begin, int end) {
        while(begin < end){
            swap(s[begin++], s[end--]);
        }
    }
public:
    string reverseStr(string& s, int k) {
        int n = s.size();
        int start = 0;

        while (n >= 2 * k) {
            reverse(s, start, start + k - 1);
            start += 2 * k;
            n -= 2 * k;
        }

        if (n >= k&& n < 2 * k) {
            reverse(s, start, start + k - 1);
        }
        else if (n < k) {
            reverse(s, start, start + n - 1);
        }
        return s;
    }
};

反转字符串中的单词 III

题目描述:

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

题解如下:

class Solution {
    void reverse(string& s, int begin, int end) {
        while (begin < end) {
            swap(s[begin++], s[end--]);
        }
    }
public:
    string reverseWords(string s) {
        int len = s.size();
        int start = 0;
        int end = 0;
        do
        {
            end = s.find(' ', end+1);
            if (end > 0) {
                reverse(s, start, end - 1);
                start = end + 1;
            }
            else {
                reverse(s, start, len - 1);
                break;
            }
        } while (start < len);
        return s;
    }
};
发布了152 篇原创文章 · 获赞 45 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/AngelDg/article/details/105049785
今日推荐