LeetCode数据结构基础---2021/8/23

K个一组翻转链表

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;
    }
};

最小栈

剑指 Offer 30. 包含min函数的栈

移除无效的括号

在这里插入图片描述
分析:
  遍历字符串:遇到左括号其序号进栈,遇到右括号就进行匹配:如果当前栈为空,说明这个位置的右括号是多余的,应该删除,否则出栈。遍历到最后,如果栈不为空,说明左括号也有多余的,应该删除。
代码:

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];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值