文章目录
- 一、题目
- 二、解法
- 三、完整代码
所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。
一、题目
二、解法
思路分析:关于变量交换有两种办法,一种是最常见的引入一个临时变量方法,另一种是使用位运算的异或算子。字符变量在计算当中是以ASCII码方式存在,进行异或运算就是做ASCII码异或运算。
程序如下:
class Solution {
public:
void reverseString(vector<char>& s) {
if (!s.size()) return; // 如果字符数组为空,直接退出
//char temp = ' ';
for (int i = 0, j = s.size() - 1; i < s.size() / 2; ++i, --j) // 循环只需一半
{
//temp = s[i];
//s[i] = s[j];
//s[j] = temp;
s[i] ^= s[j]; // ^位运算当中的异或算子
s[j] ^= s[i];
s[i] ^= s[j];
}
}
};
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n)。
- 空间复杂度: O ( 1 ) O(1) O(1)。
三、完整代码
# include <iostream>
# include <vector>
using namespace std;
void GeneratorVector(char arr[], int arr_len, vector<char>& s) {
for (int i = 0; i < arr_len; i++) {
s.push_back(arr[i]);
}
}
void my_print1(vector<char>& v, string str) {
cout << str << endl;
for (vector<char>::iterator it = v.begin(); it < v.end(); ++it) {
cout << *it << ' ';
}
cout << endl;
}
class Solution {
public:
void reverseString(vector<char>& s) {
if (!s.size()) return; // 如果字符数组为空,直接退出
//char temp = ' ';
for (int i = 0, j = s.size() - 1; i < s.size() / 2; ++i, --j) // 循环只需一半
{
//temp = s[i];
//s[i] = s[j];
//s[j] = temp;
s[i] ^= s[j]; // ^位运算当中的异或算子
s[j] ^= s[i];
s[i] ^= s[j];
}
}
};
int main()
{
char arr[] = { 'h', 'e', 'l', 'l', 'o'};
//char arr[] = { 'H', 'a', 'n', 'n', 'a', 'h'};
int arr_len = sizeof(arr) / sizeof(char);
vector<char> s;
GeneratorVector(arr, arr_len, s);
my_print1(s, "目标字符数组:");
Solution s1;
s1.reverseString(s);
my_print1(s, "翻转后的字符数组:");
system("pause");
return 0;
}
end