“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 29 天,点击查看活动详情
Day06 2023/03/04
难度:简单
题目
接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
输入描述:
输入一行,为一个只包含小写字母的字符串。
输出描述:
输出该字符串反转后的字符串。
示例
输入:abcd
输出:dcba
思路一
使用双指针法,两个指针分别从,字符串的首尾出发,每次交换两者指向的字符,即可完成反转。如图所示:
思路二
直接调用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;
}
- 时间复杂度 --- n 为字符串长度,一共循环 n/2 次
- 时间复杂度 --- 无需额外的辅助空间
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;
}
- 时间复杂度 --- n 为字符串长度,reverse函数的复杂度为O(n)
- 时间复杂度 --- 无需额外的辅助空间
总结
-
调用库函数直接实现的方式,我认为不是求解的最优方式,并没有体现你的解题思路。
-
双指针的算法思想,经常用于数组,链表,字符串,这一类数据结构的解题中。