我们同学去深信服笔试时,考了这个算法代码,所给的要求是三分钟之内写出这个程序
题目如上所示,主流解题方法有三种:
1.这种方法应该算是普普通通的那种,左下标left++,右下标right--,然后循环中使用swap交换函数来进行换位。
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
for (int left = 0, right = n - 1; left < right; ++left, --right)
{
swap(s[left], s[right]);
}
}
};
2.题中所说反转,我第一反应就是使用栈来进行反转(因为栈的特点就是先进后出),这样就完成了题中所说的反转效果。
class Solution {
public:
void reverseString(vector<char>& s) {
stack<char>istack;
for (int i = 0; i < s.size(); i++)
{
istack.push(s[i]);
}
for (int i = 0; i < s.size(); i++)
{//这里不能使用栈的长度
s[i] = istack.top();//获取栈顶元素之后出栈
istack.pop();
}
}
};
3.第三种方法的话,我觉得这个代码太聪明了,一行就解决了这个问题
class Solution {
public:
void reverseString(vector<char>& s) {
reverse(s.begin(),s.end());
}
};
关于reverse函数的stl剖析我没看,但是按照下面那篇文章所示的话,底层就是swap函数的调用
关于第三种解法中所使用到的函数reverse,具体使用以及参考取自这块: