莉莉丝9.6服务端笔试

菜鸡的笔试记录

第一题

将链表节点便利,先头插再尾插

class Solution {
public:
    ListNode* formatList(ListNode* head) {
        ListNode* dummy = new ListNode(-1);

        ListNode* ptr = head;
        ListNode* flagtail = head;

        while (ptr != nullptr && ptr->next != nullptr) {
            ListNode* h = ptr;        // 待插入到头
            ListNode* t = ptr->next;  // 待插入到尾
            ListNode* nexthead = ptr->next->next;
            // 头插
            h->next = nullptr;
            h->next = dummy->next;
            dummy->next = h;
            // 尾插
            t->next = nullptr;
            t->next = flagtail->next;
            flagtail->next = t;

            flagtail = t;  // 更新链表尾部标志
            ptr = nexthead;
        }
        // 仅剩一个节点情况的处理
        if (ptr != nullptr) {
            ptr->next = dummy->next;
            dummy->next = ptr;
        }
        return dummy->next;
    }
};

测试用例

1 2 3 4 5  -->  5 3 1 2 4
1 2 3 4 5 6  --> 5 3 1 2 4 6

思路

需要记录每次插入操作的链表结尾的前一个节点,以供尾插时使用,用一个变量记录就好。暴力loop寻找尾结点会超时。

第二题

链表有重复元素,按照已有key的升序排序链表

struct ListNode {
    int val;
    struct ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        map<int, int> dict;

        ListNode* ptr = head;
        int num = 0;

        while (ptr != nullptr) {
            dict[ptr->val] += 1; // 计数
            ptr = ptr->next;
            ++num;
        }
        ListNode* dummy = new ListNode(-1);
        ListNode* p = dummy;

        while (num) {
            for (auto item : dict) {
                if (item.second > 0) {
                    p->next = new ListNode(item.first); // 重建链表
                    dict[item.first] = item.second - 1; // 修改剩余计数
                    p = p->next;
                    --num;
                }
            }
        }
        return dummy->next;
    }
};

测试用例

3 2 3 1 1 3  -->  1 2 3 1 3 3
2 1 2 1 3   --> 1 2 3 1 2

思路

统计链表中元素的出现次数,很适合使用字典存储,可以考虑使用 std::map kv结构,而且底层使用红黑树,按照iter++ 的方式输出就是有序序列,不用对字典排序了。按照元素的个数重建链表就 OK。

第三题()

看了一眼和LRU题型差不多,没时间写了

#莉莉丝笔试##笔经##莉莉丝游戏#
全部评论
约面试了吗
点赞 回复 分享
发布于 2021-09-13 11:24

相关推荐

01-16 21:34
武汉大学 Java
点赞 评论 收藏
分享
面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
1
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务