旋转链表 警告一小时内使用相同员工卡大于等于三次的人 删除子文件夹 C++

一、LeetCode-61. 旋转链表

题目

61.旋转链表

代码

/**
 * 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:
    ListNode* rotateRight(ListNode* head, int k) {
        if(head == nullptr) { return head; }
        struct ListNode *tail, *p, *newHead;
        tail = p = head;
        int size = 1;
        while(tail->next) {
            tail = tail->next;
            size++;
        }
        tail->next = head;
        for(int i=0; i<size-k%size-1; i++) {
            p = p->next;
        }
        newHead = p->next;
        p->next = NULL;
        return newHead;
    }
};

思路

这题标了个中等题?

直接上步骤

  1. 找到尾节点并记录节点数
  2. 尾节点连接头节点
  3. p指针从head向后移动size - k % size - 1
  4. 记录新头节点newHead
  5. p下一个节点指向NULL
  6. 返回新头节点newHead

图片演示

旋转链表-01

复杂度

时间复杂度O(n),空间复杂度O(1)

二、LeetCode-1604. 警告一小时内使用相同员工卡大于等于三次的人

题目

1604.警告一小时内使用相同员工卡大于等于三次的人

代码

class Solution {
public:
    int tranTime(string strtime) {
        int time;
        time = ((strtime[0]-'0') * 10 + strtime[1]-'0') * 60 + (strtime[3]-'0') * 10 + strtime[4]-'0';
        return time;
    }

    vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
        int n = keyTime.size();
        string lastname = " ";
        vector<string> ans;

        //对名称进行排序(对应时间也同等排序)
        for(int i=0; i<n-1; i++) {
            int k = i;
            for(int j=i+1; j<n; j++) {
                if(keyName[j] < keyName[k]) {
                    k = j;
                }
            }
            swap(keyName[i], keyName[k]);
            swap(keyTime[i], keyTime[k]);
        }

        //对时间进行排序
        for(int i=0, j=0; i<n; j++) {
            if(j == n-1 || keyName[j+1] != keyName[i]) {
                sort(keyTime.begin()+i, keyTime.begin()+j+1);
                i = j + 1;
            }
        } 

        //查找被警告的人
        for(int i=0; i<n-2; i++) {
            if(keyName[i] == keyName[i+2] && lastname != keyName[i]) {
                int time1 = tranTime(keyTime[i]);
                int time2 = tranTime(keyTime[i+2]);
                if(time2 - time1 <= 60 && time2 - time1 > 0) {
                    ans.push_back(keyName[i]);
                    i = i + 2;
                    lastname = keyName[i];
                }
            }
        }
        sort(ans.begin(), ans.end());
        return ans;
    }
};

思路

残废代码,断断续续写了两天,过绝大部分用例,测试数据大会超时

这道题给的背景是名字无序,时间无序,但名字和时间一一对应

时间由string转成int分钟数,单写一个函数

所以先把名称和对应时间排序,再对相同名称内的时间排序,最后通过在[i, i+2]这个区间查找人

总之写了大半天,这道题也依托答辩,资本家都不敢这么压榨员工

复杂度

时间复杂度O(n²logn),空间复杂度O(1)

三、LeetCode-1233. 删除子文件夹

题目

1233.删除子文件夹

代码

class Solution {
public:
    vector<string> removeSubfolders(vector<string>& folder) {
        sort(folder.begin(), folder.end());
        vector<string> ans;
        ans.push_back(folder[0]);
        for(int i=1; i<folder.size(); i++) {
            int m = ans.back().size();  //最近父路径字符串长度
            int n = folder[i].size();   //当前子路径字符串长度
            if(n > m && folder[i].substr(0, m) == ans.back() && folder[i][m] == '/') {
                continue;
            }
            ans.push_back(folder[i]);
        }
        return ans;
    }
};

思路

LeetCode每日一题

这题做完看官解,跟官解一样

先对folder排序,这样便于找子文件

判断子路径的条件:

1、子路径长度大于父路径长度

2、前缀与父路径相等

3、前缀结束后有 ‘ / ’ 表示下一个文件

照着这三个条件,我们就可以轻松写下for循环里的判断

string::substr(int pos, int n);为截取从pos开始后到第n个的子字符串

如果没有满足子路径的条件,就push进ans里

复杂度

时间复杂度O(nl logn),n为folder长度,l为文件姐的平均长度

空间复杂度O(l),截取子字符串的时候需要临时空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YRoads

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

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

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

打赏作者

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

抵扣说明:

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

余额充值