K个一组翻转链表
重排链表
分析:
先将所有链表结点保存在一个数组里,然后使用双指针法进行重新链接。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
vector<ListNode*> res;
ListNode* ptr = head;
while(ptr) {
res.push_back(ptr);
ptr = ptr->next;
}
if(res.size() <= 2) {
return;
}
int i = 0, j = res.size() - 1;
while(i < j){
res[i]->next = res[j];
i++;
if(i == j) {
break;
}
res[j]->next = res[i];
j--;
}
res[i]->next = NULL;
}
};
最小栈
移除无效的括号
分析:
遍历字符串:遇到左括号其序号进栈,遇到右括号就进行匹配:如果当前栈为空,说明这个位置的右括号是多余的,应该删除,否则出栈。遍历到最后,如果栈不为空,说明左括号也有多余的,应该删除。
代码:
class Solution {
public:
string minRemoveToMakeValid(string s) {
int n = s.size();
stack<int> stk;
for(int i = 0; i < n; i++) {
if(s[i] == '(') {
stk.push(i);
}else if(s[i] == ')') {
if(stk.empty()) {
s.erase(i, 1);
n--; //长度减1
i--;
}else {
stk.pop();
}
}else {
continue;
}
}
while(!stk.empty()) {
s.erase(stk.top(), 1);
stk.pop();
}
return s;
}
};
找出游戏的获胜者
分析:
简单模拟。
代码:
class Solution {
public:
int findTheWinner(int n, int k) {
vector<int> nums;
for(int i = 1; i <= n; i++) {
nums.push_back(i);
}
int cnt = n, start = 0;
while(cnt != 1) {
int t = (start + k - 1) % nums.size();
nums.erase(nums.begin() + t);
cnt--;
if(cnt == 1) {
break;
}
start = t;
}
return nums[0];
}
};