算法训练1-day7-字符串

5 阅读1分钟

今天的是奖励关,没什么好说的

  1. 344. 反转字符串

很简单,一个reverse就能解决,不过作为练习,还是需要自己实现一遍。

如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。

如果库函数仅仅是解题过程中的一小部分,并且自己已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。

AC代码:

class Solution {
public:
    void reverseString(vector<char>& s) {
        int left = 0;
        int right = s.size() - 1;
        while (left < right) {
            swap(s[left], s[right]);
            left++;
            right--;
        }
    }
};
  1. 541. 反转字符串 II

AC代码:

class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += 2*k) {
            // 每次i递增2k,且只取前k个字符,
            // 若i + k - 1大于s.szie(),将endIndex设置为s.size()-1
            reverse(s, i, i + k - 1);
        }
        return s;
    }

    void reverse(string& s, int startIndex, int endIndex) {
        // 剩余字符少于k的情况
        if (endIndex >= s.size())
            endIndex = s.size() - 1;
        while (startIndex < endIndex) {
            swap(s[startIndex], s[endIndex]);
            startIndex++;
            endIndex--;
        }
    }
};

class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += (2 * k)) {
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= s.size()) {
                reverse(s.begin() + i, s.begin() + i + k );
            } else {
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }
};
  1. 54. 替换数字(第八期模拟笔试)

AC代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

string ReplaceCharToNumber(string s) {
  string ans;
  for (char c : s) {
    if (c >= '0' && c <= '9') {
      ans += "number";
    } else {
      ans += c;
    }
  }
  return ans;
}

int main() {
  string s;
  cin >> s;
  cout << ReplaceCharToNumber(s) << endl;

  return 0;
}