莉莉丝4.1笔试,好简单。。

第一题链表的另一种顺序返回,要求从头结点开始,后面的依次插入链表尾,链表头,链表尾
记录一个链表数组,找相对位置就行
       public ListNode formatList (ListNode head) {
        // write code here
        int num = 0;
        ListNode p = head;
        while(p != null){
            num++;
            p = p.next;
        }
        ListNode[] listNodes = new ListNode[num];
        int start = (num - 1)/2;
        int end = start+1;
        int glag = -1;
        int cnt = 0;
        p = head;
        while(p!=null){
            if(glag == -1){
                listNodes[start--] = p;
            }else {
                listNodes[end++] = p;
            }
            p = p.next;
            glag*=-1;
        }
        for (int i = 0; i < num - 1; i++) {
            listNodes[i].next = listNodes[i + 1];
        }
        listNodes[num - 1].next = null;
        return  listNodes[0];
    }
第二题简单的二分查找,排序后找,去个重就行
我这边当时直接写完了,其实找到第一个之后不需要再次二分查找,直接双指针向前向后就可以了,当时想的反正排序要nlogn,我这边降到n没有意义
     public long ans (int[] array, int k) {
        // write code here
        Arrays.sort(array);
        int start = 0;
        long res = 0;
        for (int i = 0; i < array.length; i++) {
            if(array[start] > k){
                break;
            }
            int index = partition(array, k - array[start]);//这边index的选取可以用双指针降到n
            if(index > start){
                res += (index - start);
            }
        }
        return  res;
    }
    public  int partition(int[] array, int k){
        int start = 0;
        int end = array.length;
        int res =-1;
        while(start <= end){
            int mid = (start + end)/2;
            if(array[mid] <= k){
                res = mid;
                start = mid + 1;
            }else{
                end = mid -1;
            }
        }
        return  res;
    } 

第三题环状数组分两半,求两部分和绝对差值最小
简单的滑动窗口,这边阔以在第二个while start之前设置一个==sum或者sum+1(和为奇数的情况),此时可以直接返回0/1降低了一些运行时间,这边写错了,我在交的代码改的,这里忘记改了
有的代码可能不能ac,我可能在上面改了点
       public long minimum (int[] a) {
        // write code here
        long res = Long.MAX_VALUE;
        long sum = 0;
        for (int i = 0; i < a.length; i++) {
            sum+=a[i];
        }
                long tempsum = sum;
        sum = sum/2;
        long temp = 0;
        int start = 0;
        int end = 0;
        while(end < a.length){
            while(temp < sum && end < a.length){
                temp+=a[end++];
                res = Math.min(Math.abs(tempsum - temp*2), res);
            }
            if(end == a.length - 1){
                break;
            }//这里加个if判断阔以直接返回0/1
            while(temp >= sum && start < a.length){
                temp -= a[start++];
                res = Math.min(Math.abs(tempsum - temp*2), res);
            }
        }
        while(temp > sum ){
            temp -= a[start++];
            res = Math.min(Math.abs(tempsum - temp*2), res);
        }
        return res;
    }            

代码贴上来了,仓促之间写的很丑笑死,大家看个思路就行啦,有的代码可能有些许错误我的改动没有在本地改可能是,但是思路应该是这样的

#莉莉丝游戏##笔试题目#
全部评论
第二题排序后二分是什么思路?怎么判断条件呢?
1 回复 分享
发布于 2022-04-01 21:24
现在代码能发下吗
1 回复 分享
发布于 2022-04-01 21:48
楼主问一下,你安排面试了吗,我4.1到现在没啥消息
1 回复 分享
发布于 2022-04-10 15:34
你是什么岗位的笔试啊。。我感觉挺难的,第一道很简单,第二道是最大上升子序列, 第三道数字染色 搜了下好像是个ACM的题
点赞 回复 分享
发布于 2022-04-01 20:39
第二题怎么二分呀
点赞 回复 分享
发布于 2022-04-01 20:57
投的算法 第一题简单 后面两题全是动态规划 第二题调试点成提交 就过0.5 第三天涂绳子直接没看懂
点赞 回复 分享
发布于 2022-04-02 09:47

相关推荐

菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
2 29 评论
分享
牛客网
牛客企业服务