每日算法&面试题,大厂特训二十八天——第十七天(链表)

Posted 肥学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日算法&面试题,大厂特训二十八天——第十七天(链表)相关的知识,希望对你有一定的参考价值。

目录标题

导读

肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!

特别介绍

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个冲刺大厂面试专栏还有算法比赛练习我们一起加油 上岸之路

算法特训二十八天

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置
right 的链表节点,返回 反转后的链表 。

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

思路:在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。下面的图展示了整个流程。

class Solution 
    public ListNode reverseBetween(ListNode head, int left, int right) 
        // 设置 dummyNode 是这一类问题的一般做法
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode pre = dummyNode;
        for (int i = 0; i < left - 1; i++) 
            pre = pre.next;
        
        ListNode cur = pre.next;
        ListNode next;
        for (int i = 0; i < right - left; i++) 
            next = cur.next;
            cur.next = next.next;
            next.next = pre.next;
            pre.next = next;
        
        return dummyNode.next;
    



给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

输入:head = [1,1,1,2,3]
输出:[2,3]

思路:由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。由于链表的头节点可能会被删除,因此我们需要额外使用一个哑节点(dummy node)指向链表的头节点。

具体地,我们从指针 \\textitcurcur 指向链表的哑节点,随后开始对链表进行遍历。如果当前
\\textitcur.nextcur.next 与 \\textitcur.next.nextcur.next.next
对应的元素相同,那么我们就需要将 \\textitcur.nextcur.next
以及所有后面拥有相同元素值的链表节点全部删除。我们记下这个元素值 xx,随后不断将 \\textitcur.nextcur.next
从链表中移除,直到 \\textitcur.nextcur.next 为空节点或者其元素值不等于 xx
为止。此时,我们将链表中所有元素值为 xx 的节点全部删除。

如果当前 \\textitcur.nextcur.next 与 \\textitcur.next.nextcur.next.next
对应的元素不相同,那么说明链表中只有一个元素值为 \\textitcur.nextcur.next 的节点,那么我们就可以将
\\textitcurcur 指向 \\textitcur.nextcur.next。

当遍历完整个链表之后,我们返回链表的的哑节点的下一个节点 \\textitdummy.nextdummy.next 即可。

class Solution 
    public ListNode deleteDuplicates(ListNode head) 
        if (head == null) 
            return head;
        
        
        ListNode dummy = new ListNode(0, head);

        ListNode cur = dummy;
        while (cur.next != null && cur.next.next != null) 
            if (cur.next.val == cur.next.next.val) 
                int x = cur.next.val;
                while (cur.next != null && cur.next.val == x) 
                    cur.next = cur.next.next;
                
             else 
                cur = cur.next;
            
        

        return dummy.next;
    




面试题

谈谈自己对于 Spring AOP 的了解?
AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块
所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统
的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性

Spring Bean 容器的生命周期是什么样的?
 Bean 容器找到配置文件中 Spring Bean 的定义。
 Bean 容器利用 Java Reflection API 创建一个 Bean 的实例。
 如果涉及到一些属性值 利用 set()方法设置一些属性值。
32
 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入 Bean 的
名字。
 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,
传入 ClassLoader 对象的实例。
 如果 Bean 实现了 BeanFactoryAware 接口,调用 setBeanFactory()方法,传入
BeanFactory 对象的实例。
 与上面的类似,如果实现了其他 *.Aware 接口,就调用相应的方法。
 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行
postProcessBeforeInitialization() 方法
 如果 Bean 实现了 InitializingBean 接口,执行 afterPropertiesSet()方法。
 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行
postProcessAfterInitialization() 方法
 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方
法。
 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,
执行指定的方法

本文来源于算法面试题特训专栏,这里有大量专业性的算法题比如(动态规划21天,大厂特训28天等等)
欢迎大家一起学习。

链接:传送门

点击直接资料领取

这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。

以上是关于每日算法&面试题,大厂特训二十八天——第十七天(链表)的主要内容,如果未能解决你的问题,请参考以下文章

每日算法&面试题,大厂特训二十八天——第十九天(树)

每日算法&面试题,大厂特训二十八天——第十七天(链表)

每日算法&面试题,大厂特训二十八天——第十二天(数组)

每日算法&面试题,大厂特训二十八天——第十五天(字符串)

每日算法&面试题,大厂特训二十八天——第二十八天(数组)

每日算法&面试题,大厂特训二十八天——第八天(递归|回溯)