云智手撕算法

1. leetcode 3 最长无重复字串

public int lengthOfLongestSubstring(String s) {
       int i=0,j=0;
       Set<Character> set=new HashSet<>();
       int maxLen=0;
       while (j<s.length()){
           char  c=s.charAt(j);
           while (set.contains(c)){
               set.remove(s.charAt(i));
               i++;
           }
           maxLen=Math.max(maxLen,j-i+1);  //更新每次的最大长度
           j++;
           set.add(c);
       }
       return maxLen;
    }

虽然是双层 while 循环,使用了滑动窗口的思想,算法时间复杂度还是 ON 的。

2. 二叉树广度和广度遍历方式

自己定义了一个 TreeNode,构建出来二叉树,然后进行遍历。

深度优先使用递归方式遍历,广度优先使用队列来遍历。

public class TreeNode {

    public Integer value;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(Integer value, TreeNode left, TreeNode right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }

    public TreeNode() {
    }
    public TreeNode(Integer value) {
        this.value=value;
        this.left=null;
        this.right=null;
    }
}

深度优先遍历方式:

    public  static  void  printDFS(TreeNode root){
         if (root==null){
             return;
         }
        //前序遍历方式
        System.out.println(root.value);
        printDFS(root.left);
        printDFS(root.right);
    }

广度优先遍历:

public  static  void  printBFS(TreeNode root){
Queue<TreeNode> queue=new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()){
    TreeNode node=queue.poll();
    System.out.println(node.value);
    if (node.left!=null){
        queue.add(node.left);
    }
    if (node.right!=null){
        queue.add(node.right);
    }
}
}

手写快速排序

先和面试官说快排的思想

采用“分治”的思想,对于一组数据,选择一个基准元素(base),通常选择第一个或最后一个元素,通过第一轮扫描,比base小的元素都在base左边,比base大的元素都在base右边,再有同样的方法递归排序这两部分,直到序列中所有数据均有序为止。

   public static void quickSort(int[] arr, int start, int end) {
        //基准值是temp
        if (start < end) {
            int base = arr[start];
            int left = start;
            int right = end;
            while (left < right && arr[right] > base) {
                //后面的小于了temp
                right--;
            }
            arr[left] = arr[right];
            //右边基准
            while (left < right && arr[left] < base) {
                left++;
            }
            arr[right] = arr[left];
            arr[left] = base;
            quickSort(arr, start, left - 1);
            quickSort(arr, left + 1, end);
        }
    }

没写出来,爆战了,很难受。

优化之后的代码:

通过三数字取中减少时间的复杂度。

public static void quickSort(int[] arr, int start, int end) {
    if (start >= end) return;

    // 三数取中法选择基准
    int mid = start + (end - start) / 2;
    if (arr[start] > arr[end]) swap(arr, start, end);
    if (arr[mid] > arr[end]) swap(arr, mid, end);
    if (arr[start] < arr[mid]) swap(arr, start, mid);

    int base = arr[start];
    int i = start, j = end;
    while (i < j) {
        while (i < j && arr[j] >= base) j--;
        if (i < j) arr[i++] = arr[j];
        while (i < j && arr[i] <= base) i++;
        if (i < j) arr[j--] = arr[i];
    }
    arr[i] = base;
    quickSort(arr, start, i - 1);
    quickSort(arr, i + 1, end);
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

可以参考这个博客

https://blog.csdn.net/qq_39181839/article/details/109478094

#手撕题#
牛牛的算法专栏 文章被收录于专栏

牛牛的算法专栏,记录一些算法题

全部评论
二面?
点赞 回复 分享
发布于 04-09 12:59 陕西

相关推荐

1️⃣排序与选择·快排(&nbsp;LC&nbsp;912)·数组中第&nbsp;k&nbsp;大的元素(&nbsp;LC&nbsp;215)·数组中最小的&nbsp;k&nbsp;个数(&nbsp;LC&nbsp;面试题17.14)2️⃣二分与数学(含概率)·&nbsp;sqrt&nbsp;(&nbsp;x&nbsp;)(&nbsp;LC&nbsp;69)·pow&nbsp;(&nbsp;x&nbsp;,&nbsp;n&nbsp;)(&nbsp;LC&nbsp;50)·搜索旋转数组(&nbsp;LC&nbsp;33)·Rand7实现Rand10(&nbsp;LC&nbsp;470)3️⃣双指针与滑动窗口·三数之和(&nbsp;LC&nbsp;15)·滑动窗口最大值(&nbsp;LC&nbsp;239)·有效三角形的个数(&nbsp;LC&nbsp;611)·最小覆盖子串(&nbsp;LC&nbsp;76)·长度最小子数组(&nbsp;LC&nbsp;209)4️⃣栈与队列/表达式·有效的括号(&nbsp;LC&nbsp;20)·最长有效括号(&nbsp;LC&nbsp;32)·逆波兰表达式求值(&nbsp;LCR&nbsp;036)5️⃣链表·反转链表(&nbsp;LC&nbsp;206)·反转链表&nbsp;II&nbsp;(&nbsp;LC&nbsp;92)·k&nbsp;个一组翻转链表(&nbsp;LC&nbsp;25)·环形链表/环形链表&nbsp;II&nbsp;(&nbsp;LC&nbsp;141/142)·删除链表倒数第&nbsp;n&nbsp;个节点(&nbsp;LC&nbsp;19)·课程表&nbsp;II&nbsp;(&nbsp;LC&nbsp;210)6️⃣动态规划(序列/路径/计数/区间)·最大子数组和(&nbsp;LC&nbsp;53)·最长递增子序列&nbsp;LIS&nbsp;(&nbsp;LC&nbsp;300)·最小路径和(&nbsp;LC&nbsp;64)·加油站(贪心/&nbsp;DP&nbsp;,&nbsp;LC&nbsp;134)·最大乘积子数组(&nbsp;LC&nbsp;152)·打家劫舍&nbsp;II&nbsp;(&nbsp;LC&nbsp;213)·不同的子序列(&nbsp;LC&nbsp;115)·爬楼梯(&nbsp;LC&nbsp;70)·最长公共子序列&nbsp;LCS&nbsp;(&nbsp;LC&nbsp;1143)7️⃣字符串·最长回文子串(&nbsp;LC&nbsp;5)·最长回文子序列(&nbsp;LC&nbsp;516)·字符串解码(&nbsp;LC&nbsp;394)·编辑距离(&nbsp;LC&nbsp;72)·大数相乘(&nbsp;LC&nbsp;43)
点赞 评论 收藏
分享
二面:tl:9.22&nbsp;约面&nbsp;-&nbsp;9.23&nbsp;面试&nbsp;-&nbsp;当晚约三面1.&nbsp;介绍一下&nbsp;RPC&nbsp;的实现原理,它是如何根据方法名找到对应的方法并进行调用的?2.&nbsp;AOP&nbsp;在&nbsp;RPC&nbsp;中具体是如何实现的?3.&nbsp;RPC&nbsp;的数据序列化协议(格式)是什么样的?4.&nbsp;在网络传输中,数据格式是如何封装进去的?5.&nbsp;针对&nbsp;Protobuf、JSON、Java&nbsp;序列化等数据格式,对比它们的优缺点。6.&nbsp;虚拟内存(Virtual&nbsp;Memory)的作用是什么?为什么需要分段、分页和段页式管理?7.&nbsp;页面置换算法有哪些?8.&nbsp;如何实现&nbsp;LRU&nbsp;(最近最少使用)&nbsp;算法?其数据结构如何设计?9.&nbsp;如果要实现&nbsp;LFU&nbsp;(最不经常使用)&nbsp;算法,该如何设计数据结构?10.&nbsp;进程间通信(IPC)的方式有哪些?11.&nbsp;共享内存如何实现两个进程间的通信(例如半双工)?12.&nbsp;信号量(Semaphore)和管道(Pipe)的区别是什么?13.&nbsp;信号(Signal)的基本概念是什么,常用于什么场景?14.&nbsp;网络中的同步和异步的关系是什么?15.&nbsp;阻塞和非阻塞的区别是什么?16.&nbsp;网络&nbsp;I/O&nbsp;模型有哪些?17.&nbsp;内核态和用户态的区别是什么?18.&nbsp;HTTP/Cookie&nbsp;和&nbsp;Session/Cookie&nbsp;的区别?19.&nbsp;跨域&nbsp;Cookie&nbsp;是指什么?20.&nbsp;有一个很大的文件,每行数据格式为&nbsp;时间戳&nbsp;和&nbsp;文本内容,且时间戳是升序的。如何在单机上高效地查找某一时间范围内的所有文本内容?21.&nbsp;如何写出合并&nbsp;K&nbsp;个有序数组到第&nbsp;K&nbsp;大元素的算法?22.&nbsp;手撕:两个有序数组中第k小的数三面:&nbsp;tl:9.25&nbsp;面试&nbsp;-&nbsp;当晚通过1.&nbsp;自我介绍2.&nbsp;实习拷打3.&nbsp;UTF-8&nbsp;英文占几个字节、中文占几个字节、Java&nbsp;里如何去检查其占几个字节4.&nbsp;七层网络协议5.&nbsp;HTTPS&nbsp;是否了解过6.&nbsp;最近在学什么、看什么书,分享一下7.&nbsp;手撕:79.&nbsp;单词搜索(可以重复选取同一个字母)8.&nbsp;反问
查看29道真题和解析
点赞 评论 收藏
分享
评论
3
15
分享

创作者周榜

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