蓝蓝计算机考研算法-day06字符串反转

211 阅读2分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 29 天,点击查看活动详情

Day06 2023/03/04

难度:简单

题目

接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

输入描述:

输入一行,为一个只包含小写字母的字符串。

输出描述:

输出该字符串反转后的字符串。

示例

输入:abcd
输出:dcba

思路一


使用双指针法,两个指针分别从,字符串的首尾出发,每次交换两者指向的字符,即可完成反转。如图所示:

C2B0A2DAF9A4B9FF5F6B792BBC2BC3ED.gif

思路二


直接调用c++算法函数库中的reverse反转函数实现。

关键点


  • 思路一中,使用双指针法,当字符串中字符个数 n 为偶数时,则交换 n/2次,最中间的那个元素不需要被交换;当字符串中字符个数 n 为奇数时,也交换 n/2次,但最中间的那个元素也被交换了

算法实现


c++代码实现1-双指针法

#include <algorithm> //算法库
#include <iostream>
#include <string>

using namespace std;

// 方法一:使用双指针法
int main() {
    cout << "请输入待反转字符串:";
    string s;        //输入的字符串(纯小写)
    getline(cin, s); //获取整个字符串
    //循环遍历整个字符串(一共n/2次)
    char temp = ' '; //中间变量,用于交换字符
    for (int i = 0; i < s.length() / 2; i++) {
        //交换元素
        temp = s[i];
        s[i] = s[s.length() - 1 - i]; //初始时i=0,所以额外减一,令其等于数组下标
        s[s.length() - 1 - i] = temp;
    }
    cout << "反转后:" << s << endl;
    return 0;
}
  • 时间复杂度 O(n)O(n) --- n 为字符串长度,一共循环 n/2
  • 时间复杂度 O(1)O(1) --- 无需额外的辅助空间

c++代码实现2-反转函数

#include <algorithm> //算法库
#include <iostream>
#include <string>

// 方法二:使用reverse反转函数
int main() {
    cout << "请输入待反转字符串:";
    string s;        //输入的字符串(纯小写)
    getline(cin, s); //获取整个字符串
    reverse(s.begin(), s.end()); //调用反转函数
    cout << "反转后:" << s << endl;
    return 0;
}
  • 时间复杂度 O(n)O(n) --- n 为字符串长度,reverse函数的复杂度为O(n)
  • 时间复杂度 O(1)O(1) --- 无需额外的辅助空间

总结

  • 调用库函数直接实现的方式,我认为不是求解的最优方式,并没有体现你的解题思路。

  • 双指针的算法思想,经常用于数组,链表,字符串,这一类数据结构的解题中。