字符串-反转字符串

字符串

反转字符串 (leetcode.344)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

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

难度并不大,主要是从for循环开始考虑,反转字符串,也就是始末交换,如果是偶数,那恰好可以交换成功,如果是奇数,会剩下中间一个不用交换,所以循环从开始到中间 n/2。

反转字符串II (leetcode.541)

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

题目虽然看上去有点复杂,但是总体来看,还是循环,首先我们需要一个可以相互交换的函数

void reverse(string& s, int start, int end){
        for(int i = start,j = end; i < j; ++i, --j){
            swap(s[i], s[j]);
        }
}

输入一个字符串,规定始末,两两交换。

外层循环是2k步数,内存交换逻辑是前k个交换,如果k超出字符串大小,那么则交换剩下的。

class Solution {
public:
    void reverse(string& s, int start, int end){
        for(int i = start,j = end; i < j; ++i, --j){
            swap(s[i], s[j]);
        }
    }
    string reverseStr(string s, int k) {
        for(int i = 0; i < s.size(); i += 2*k){
            if(i+k <= s.size()){ // 正常情况,半个步长是小于等于字符串大小的
                reverse(s,i,i+k-1); // 需要减1,因为是索引
            } else {
                reverse(s,i,s.size()-1);
            }
        }
        return s;
    }
};
posted @ 2026-03-08 16:18  wenyiGamecpp  阅读(16)  评论(0)    收藏  举报