反转字符串 II
分析:
简单模拟。
代码:
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size();
if(n < k) {
reverse(s.begin(), s.end());
return s;
}
if(n < 2 * k) {
reverse(s.begin(), s.begin() + k);
//reverse(s.begin() + k, s.end());
return s;
}
int start = 0;
while(true) {
reverse(s.begin() + start, s.begin() + start + k);
start += 2 * k;
if(start > n) {
break;
}
if(start + k > n) { //少于k个
reverse(s.begin() + start, s.end());
return s;
}
if(start + 2 * k > n) { //k和2k之间
reverse(s.begin() + start, s.begin() + start + k);
return s;
}
}
return s;
}
};
逆波兰表达式求值
分析:
后缀表达式求值。
代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> stk;
string ops = "+-*/";
for(string x : tokens) {
if(ops.find(x) == -1) {
int temp = atoi(x.c_str());
stk.push(temp);
}else {
int x2 = stk.top();stk.pop();
int x1 = stk.top();stk.pop();
if(x == "+") {
stk.push(x1 + x2);
}else if(x == "-") {
stk.push(x1 - x2);
}else if(x == "*") {
stk.push(x1 * x2);
}else {
stk.push(x1 / x2);
}
}
}
return stk.top();
}
};
从中序与后序遍历序列构造二叉树
分析:
递归构建二叉树。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
unordered_map<int, int> mp;
TreeNode* create(vector<int>& post, int x1, int x2, int x3, int x4) {
if(x1 > x2 || x3 > x4) {
return NULL;
}
int root_val = post[x2];
TreeNode* root = new TreeNode(root_val);
int x = mp[root_val];
int y = x1 + x - 1 - x3;
//创建左子树
root->left = create(post, x1, y, x3, x - 1);
root->right = create(post, y + 1, x2 - 1, x + 1, x4);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int n = inorder.size();
for(int i = 0; i < n; i++) {
mp[inorder[i]] = i;
}
TreeNode* res = create(postorder, 0, n - 1, 0, n - 1);
return res;
}
};