题目
-
- 买票需要的时间
-
- 反转偶数长度组的节点
思路与算法
-
- 买票需要的时间
处理思路:直接进行模拟即可,找到位置k上的人需要买的票的数量,排在他之前的人至少要买跟他同样数量的票,排在他后面的人至少需要买比他的票少一张的数量。注意后者不要搞错就可以解决这道题了。 -
- 反转偶数长度组的节点
这道题容易出问题的点在于如果最后剩余的节点数量为偶数,那么不管前面这一组节点是否为偶数,最后一组都要进行翻转,在206题翻转链表的基础上做这道题只需要维护一个偶数还是奇数的位置索引即可完成本题的拼接。还有一种解法是将元素全部打入向量vector,利用vector容器进行处理,这个也是个办法,但是应该不是本题要考察的根本目的,所以不去投这个机。我们就使用链表的本地翻转即可。
代码实现
-
- 买票需要的时间
class Solution {
public:
int timeRequiredToBuy(vector<int>& tickets, int k) {
int ans = 0;
for (int i = 0;i < tickets.size(); ++i) {
if (i < k) {
if (tickets[i] <= tickets[k]) {
ans += tickets[i];
} else {
ans += tickets[k];
}
} else if (i == k) {
ans += tickets[k];
} else {
if (tickets[i] >= tickets[k]) {
ans += (tickets[k] - 1);
} else {
ans += tickets[i];
}
}
}
return ans;
}
};
-
- 反转偶数长度组的节点
class Solution {
public:
ListNode* reverseEvenLengthGroups(ListNode* head) {
ListNode* cur = head, *curHead = head, *preLast = NULL;
int curLen = 0;
while (cur) {
int len = curLen;
curHead = cur;
int actualLen = 0;
while (len && cur->next) {
cur = cur->next;
actualLen++;
len--;
}
ListNode* next = cur->next;
if (actualLen & 1) {
cur->next = NULL;
ListNode* rHead = reverse(curHead);
curHead->next = next;
preLast->next = rHead;
preLast = curHead;
} else {
preLast = cur;
}
cur = next;
curLen++;
}
return head;
}
ListNode* reverse(ListNode* head) {
ListNode *pre = NULL, *cur = head;
while (cur) {
ListNode* tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
写在最后
- 这周开始无论多忙周赛必须记录。
|