The description of the problem
Write a function that reverses a string. The input string is given as an array of characters s.
You must do this by modifying the input array in-place with constant extra memory.
An example:
Input: s = [‘h’, ‘e’, ‘l’, ‘l’, ‘o’]
Output: [‘o’, ‘l’, ‘l’, ‘e’, ‘h’]
The intuition
- two indexes, one of which starts from the begins, the other of which starts from the ends.
The solution code
The best one
#include <vector>
#include <iostream>
using namespace std;
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
for (int i = 0, j = n - 1; i < n/2; i++, j--) {
//swap(s[i], s[j]);
// use xor operation to swap two elements
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
}
}
};
int main() {
Solution s;
vector<char> s1 = {'h', 'e', 'l', 'l', 'o'};
std::cout << "before reverse: ";
for (auto c : s1) {
std::cout << c << " ";
}
std::cout << std::endl;
std::cout << "after reverse: ";
s.reverseString(s1);
for (auto c : s1) {
cout << c << " ";
}
cout << endl;
return 0;
}
The most intuitive one
#include <vector>
#include <iostream>
using namespace std;
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
vector<char> original(s);
for (int i = 0; i < n; i++) {
s[i] = original[n - i - 1];
}
}
};
int main() {
Solution s;
vector<char> s1 = {'h', 'e', 'l', 'l', 'o'};
std::cout << "before reverse: ";
for (auto c : s1) {
std::cout << c << " ";
}
std::cout << std::endl;
std::cout << "after reverse: ";
s.reverseString(s1);
for (auto c : s1) {
cout << c << " ";
}
cout << endl;
return 0;
}
The corresponding results
before reverse: h e l l o
after reverse: o l l e h