美文网首页leetcod...
第六天: Hot 20 , 大厂面试算法真题leetcode,9

第六天: Hot 20 , 大厂面试算法真题leetcode,9

作者: 鹏城十八少 | 来源:发表于2022-09-13 11:37 被阅读0次

    关于作者:

    大家好,我是Leetcode 2020--2022,连续3年金牌获得者,和亚洲区域赛铜牌获得者,

    先后在字节和大疆从事技术研发,现在是阿里达摩院的扫地僧,面试专家,CSDN博客专家。

    对算法一定的见解,是一个刷题10年的算法爱好者 ,利用工作之余刷leetcode。成为leetcode官方答案贡献者之一。

    7天课程目录,免费!踢馆抖音算法 (7天刷新法)

    1. 第一天:一个视频教会你时间复杂度和空间复杂度                                             0912

    2. 第二天:一个视频教会你必考的8种数据结构(视频,图文并茂)                     0913

    3. 第三天:一个视频教会你常用的8中解题方法和算法模版(简直不要太简单)    0912

    4. 第四天:一个视频教会你 6大高频考点 常用操作技巧,常用的字符,数组,类型(独家) 0911

    5. 第五天: Top10,最高频题,99%命中面试题(字节,快手,shapee,大疆, 华为,蔚来  )  ok

    6. 第六天: Hot 20 , 大厂面试算法真题,95%命中(精选: 京东,美团,小米,拼多多,网易)(非算法工程师误入) 0910

    7. 第七天: Top5,  经典热题5,90%命中面试题(剑指offer)

    题库来源: Top100&&Top50 出现频率五颗星

    1. 最高频题,995%命中题(精选: 京东,美团,小米,拼多多,网易)

    2.  作为大厂面试管,经常出题,同时从海量题库中找出9题。

    Top1:   27:移除元素                               双指针

    Top2:   24: 链表交换                链表节点

    Top3:   77:组合                                       DFS和BFS的区别

    Top4:   90: 子集2                                    回溯

    Top5:   268:丢失的数字                           哈希表  

    Top6:    53. 最大子数组和                        分治+数组

    Top7:    57:插入区间                                排序法

    Top8:    209: 长度最小的子数组                滑动窗口

    Top9:   35:搜索插入的位置                        二分法

    总结:8种排序+8种数据结构+8种算法+6大类型考题

    Top1:   27:移除元素                               双指针

    public class Leetcode27 {

    public int removeElement(int[] nums, int val) {

    if (nums ==null || nums.length ==0) {

    return 0;

            }

    int l =0;

            int r = nums.length -1;

            while (l < r) {

    while (l < r && nums[l] != val) {

    l++;

                }

    while (l < r && nums[r] == val) {

    r--;

                }

    int temp = nums[l];

                nums[l] = nums[r];

                nums[r] = temp;

            }

    return nums[l] == val ? l : l +1;

        }

    }

    Top2:   24: 链表交换                链表节点

    public class Leetcode24 {

    public ListNodeswapPairs(ListNode head) {

    if (head ==null || head.next ==null) {

    return head;

            }

    ListNode newHead = head.next;

            head.next = swapPairs(newHead.next);

            newHead.next = head;

            return newHead;

        }

    }

    Top3:   77:组合                                       DFS和BFS的区别

    Top4:   90: 子集2                                    回溯

    private List<List<Integer>> ans = new ArrayList<>();

        public List<List<Integer>> combine(int n, int k) {

            getCombine(n, k, 1, new ArrayList<>());

            return ans;

        }

        public void getCombine(int n, int k, int start, List<Integer> list) {

            if(k == 0) {

                ans.add(new ArrayList<>(list));

                return;

            }

            for(int i = start;i <= n - k + 1;i++) {

                list.add(i);

                getCombine(n, k - 1, i+1, list);

                list.remove(list.size() - 1);

            }

        }

    Top5:   268:丢失的数字                           哈希表  

    public class Leetcode268 {

    /***

    *示例 1:

    *

    * 输入:nums = [3,0,1]

    * 输出:2

    * 解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

        * @param nums

        * @return

        */

        public int missingNumber(int[] nums) {

    HashSet set =new HashSet<>(); // 不会重复

            for (int num : nums) {// 存放在hashset中

                set.add(num);

            }

    for (int i =0; i < nums.length; i++) {

    if (!set.contains(i)) {

    return i;

                }

    }

    return nums.length;

        }

    }

    Top6:    53. 最大子数组和                        分治+数组

    public class Leetcode53 {

    /***

    * 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

    * 输出:6

    * 解释:连续子数组 [4,-1,2,1] 的和最大,为 6

        * @param nums

        * @return

        */

        public int maxSubArray(int[] nums) {

    return getMaxDividing(nums, 0, nums.length -1);

        }

    private int getMaxDividing(int[] nums, int start, int end) {

    if (start == end) {

    return nums[start];

            }

    // 得到中间的索引

            int middle = start + (end - start) /2;

            int leftSum =0;

            int rightSum =0;

            int crossSum =0;

            // 得到最左边的最大值

            leftSum = getMaxDividing(nums, start, middle);

            // 得到右边的最大值

            rightSum = getMaxDividing(nums, middle +1, end);// 起始值注意+1

            crossSum = getCrossSum(nums, start, end);

            int max = Math.max(leftSum, rightSum);

            max = Math.max(max, crossSum);

            return max;

        }

    private int getCrossSum(int[] nums, int start, int end) {

    int middle = start + (end - start) /2;

            int leftSum =0;

            int leftMax =0;

            for (int i = middle; i >0; i--) {

    leftSum = leftSum + i;

                if (leftSum > leftMax) {

    leftMax = leftSum;

                }

    }

    int rightSum =0;

            int rightMax =0;

            for (int i = middle +1; i < end; i++) {

    rightSum = rightSum + i;

                if (rightSum > rightMax) {

    rightMax = rightSum;

                }

    }

    return leftMax + rightMax;

        }

    }

    Top7:    57:插入区间                                排序法

    public class Leetcode57 {

    @RequiresApi(api = Build.VERSION_CODES.N)

    public int[][]insert(int[][] intervals, int[] newInterval)throws Exception {

    if (intervals.length ==0) {

    return new int[][]{newInterval};

            }

    ArrayList result =new ArrayList<>();

            ArrayList temp =new ArrayList<>();

            for (int[] interval : intervals) {

    temp.add(interval);

            }

    temp.add(newInterval);

            temp.sort((a, b) -> a[0] - b[0]);

            for (int[] interval : temp) {

    int[] lastestResult = result.size() ==0 ?new int[]{-1, -1} : result.get(result.size() -1);

                if (result.size() ==0 || lastestResult[1] < interval[0]) {

    result.add(interval);

                }else {

    lastestResult[1] = Math.max(lastestResult[1], interval[1]);

                }

    }

    return result.toArray(new int[result.size()][2]);

        }

    }

    Top8:    209: 长度最小的子数组                滑动窗口

    public class Leetcode209 {

    public int minSubArrayLen(int target, int[] nums) {

    if (nums ==null || nums.length ==0) {

    return 0;

            }

    int size =1;

            while (size <= nums.length) {

    for (int i =0; i < nums.length - size +1; i++) {

    int total =0;

                    for (int j = i; j < i + size; j++) {

    total += nums[j];

                    }

    if (total >= target) {

    return size;

                    }

    }

    size++;

            }

    return 0;

        }

    }

    Top9:   35:搜索插入的位置                        二分法

    public class Leetcode35 {

    public int searchInsert(int[] nums, int target) {

    if (nums ==null || nums.length ==0) {

    return 0;

            }

    int left =0;

            int right = nums.length -1;

            while (left < right) {

    int mid = left + (right - left) /2;

                if (nums[mid] == target) {

    return mid;

                }else if (nums[mid] > target) {

    right = mid;

                }else {

    left = mid +1;

                }

    }

    return nums[left] < target ? left +1 : left;

        }

    }

    相关文章

      网友评论

        本文标题:第六天: Hot 20 , 大厂面试算法真题leetcode,9

        本文链接:https://www.haomeiwen.com/subject/sxxhortx.html