从上千份大厂面经呕心沥血整理:大厂高频手撕面试题(数据结构和算法篇 ,Java实现亲试可跑)

目录

手撕冒泡排序(美团)

手撕快速排序(作业帮)

手撕堆排序(美团)

手撕归并排序(美团)

手撕二分查找(VIVO)

 海量数据找出前K大

字符串的全排列(要求去重)(字节跳动)

求一个字符串中最长不重复子串的长度(字节跳动)

 反转字符串的单词:如何在原字符串上翻转字符串(如将 "i am student" 翻转为 "student am i"),要求空间复杂度为 O (1)?(字节跳动、美团、滴滴)

压缩字符串题wsssgkeghh 变为 w3sgkeg2h(云从科技)

单链表反转(贝壳)

反转链表中前 K 个节点

 链表判环,找入口

 删除字符串中的字符。

求数组的全排列(VIVO) 

合并两个有序数组或有序链表(字节跳动、货拉拉)

输出 2 到 N 之间的全部(VIVO)


怎么判断两个链表是否相交?怎么优化?(字节跳动、货拉拉)

判断两个链表是否相交可以采用多种方法。

一种方法是使用双指针。首先分别遍历两个链表,得到两个链表的长度。然后让长链表的指针先走两个链表长度差的步数。之后,同时移动两个链表的指针,每次比较两个指针是否指向相同的节点。如果指向相同节点,那么这两个链表相交;如果直到指针都走到链表末尾还没有相同节点,那么这两个链表不相交。

  // ListNode 定义
    static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }

    public boolean isIntersect(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return false;
        }

        // 1. 计算两个链表的长度
        int lenA = getLength(headA);
        int lenB = getLength(headB);

        // 2. 让较长的链表先走一段距离,使得两个链表剩余部分长度相同
        while (lenA > lenB) {
            headA = headA.next;
            lenA--;
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大模型大数据攻城狮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值