• 力扣名企直通车-学习计划-网易-刷题记录


    一、买卖股票的最佳时机

     思路:

            遍历数组,用 minprice 记录历史最低价格买入,就假设股票是这一天买的,然后我们得到的利润就是 price[i] - minprice 。

    1. public int maxProfit(int[] prices) {
    2. int minprice = Integer.MAX_VALUE;
    3. int money = 0;
    4. for(int i : prices){
    5. money = Math.max(money, i - minprice);
    6. minprice = Math.min(minprice, i);
    7. }
    8. return money;
    9. }

    二、链表随机节点

     我自己刚开始做这个题的时候都没读懂题意,一直没理解到底要干嘛,所以人家大公司到底是大公司,题难啊。真是应了那句话,简单题我重拳出击,中等题我唯唯诺诺,困难题直接看题解,哈哈哈。

    本来我还想着去看看这个水塘抽样是怎样的算法啥的,突然反应过来,这个题不就是让我给链表随机放数据进去吗,我恍然大悟。

    思路

    首先我们需要知道随机函数的使用,我举一个栗子,如果是一个大小为n的数组,求随机元素其实很简单,随机函数 int m = new Random().newxtInt(n) 就可以了。然后链表的逻辑和这个差不多,只是需要我们在初始化的时候计算出链表的大小n,再随机获取链表元素的位置 int m = new Random().newxtInt(n);再遍历链表的第m个元素。

    1. class Solution {
    2. ListNode cur;
    3. int size;
    4. Random rand = new Random();
    5. public Solution(ListNode head) {
    6. cur = head;
    7. ListNode index = cur;
    8. int count = 0;
    9. while (index != null){
    10. count++;
    11. index = index.next;
    12. }
    13. size = count;
    14. }
    15. public int getRandom() {
    16. int m = rand.nextInt(size);
    17. ListNode index = cur;
    18. while (m > 0){
    19. index = index.next;
    20. m--;
    21. }
    22. return index.val;
    23. }
    24. }

    三、两数之和

     这个题比较简单,然后我给出了两种思路。

    第一种思路

    利用哈希的思想

    我这里假设第一个数字是 a ,第二个数字是 b ,然后我们遍历数组直到见到数字 a 时,就用target 减去 a,就会得到 b,若 b 存在于哈希表中,我们就可以直接返回结果了。若 b 不存在,那么我们就将 a 存入哈希表,继续让后续遍历的数字来比。我这里是把两数的差值当作 value 存入的哈希表。就是算出当前数字减之后和 target 的差,然后检查哈希表。

    1. public int[] twoSum(int[] nums, int target) {
    2. Map map = new HashMap<>();
    3. for (int i = 0; i < nums.length; ++i) {
    4. if (map.containsKey(target - nums[i])) {
    5. return new int[]{map.get(target - nums[i]), i};
    6. }
    7. map.put(nums[i], i);
    8. }
    9. return new int[0];
    10. }

    第二种思路

    暴力求解,直接遍历数组

    1. public int[] twoSum(int[] nums, int target) {
    2. for (int i = 0; i < nums.length; i++) {
    3. for (int j = i + 1; j < nums.length; j++) {
    4. if (nums[i] + nums[j] == target) {
    5. return new int[]{i, j};
    6. }
    7. }
    8. }
    9. return null;
    10. }

    四、找出第 N 个二进制字符串中的第 K 位

    思路

    遇到这种查找某个字符的位置,我马上就想到了二分查找。但是我最开始是没想出代码到底该偶怎么写的,是看了官方的题解思路在写出来的,然后我现在的想法就是根据下面这个图来的

    由上图可以得出:

    1. Si 的长度是 2^i - 1。
    2. Si的长度是奇数,中间位置 一定是 1。

    所以中间位置 mid = (2^n - 1) / 2 + 1,注意:k是从1开始的,后面就分情况看k是否大于小于mid,去进行递归。

    1. public char findKthBit(int n, int k) {
    2. if (n == 1) {
    3. return '0';
    4. }
    5. int sLen = (1 << n) - 1;
    6. int mid = (sLen >> 1) + 1;
    7. if (k == mid) {
    8. return '1';
    9. } else if (k < mid) {
    10. // 左边是正常的
    11. return findKthBit(n - 1, k);
    12. } else {
    13. // 右边是镜像+翻转
    14. k = sLen + 1 - k;
    15. return findKthBit(n - 1, k) == '0' ? '1' : '0';
    16. }
    17. }

    五、分发糖果

     说实话这个题读完题的时候感觉也没什么难度,就算不知道该怎么下手写代码,从哪个角度入手去写,我看题解都有点晕晕的,这里就没有写后续的代码了。呜呜

     

  • 相关阅读:
    Java 枚举(Enum)使用
    通过HFS低成本搭建NAS,并内网穿透实现公网访问
    深入解析:数据库连接池的必要性与优化策略
    Leetcode2760. 最长奇偶子数组
    Axure教程—单色折线图(中继器)
    LPC2478(22)IAP在线升级
    Spring 深入——IoC 容器 01
    ansible安装和常见模块
    @RabbitListener和@RabbitHandler的使用
    泰山派学习笔记(二)一步一步编译SDK文件
  • 原文地址:https://blog.csdn.net/qq_52592775/article/details/126286272