• 挑战100天 AI In LeetCode Day05(热题+面试经典150题)


    一、LeetCode介绍

    在这里插入图片描述

    LeetCode是一个在线编程网站,提供各种算法和数据结构的题目,面向程序员、计算机科学专业学生和技术爱好者等人群,旨在帮助他们提高算法和编程技能。LeetCode上的问题通常来自各种技术公司的面试题目,因此它也是程序员面试准备的重要资源之一。

    LeetCode上的问题涵盖了各种难度级别,从入门级到专家级都有不同难度的题目可供练习。用户可以选择使用不同的编程语言提交答案,LeetCode能够对结果进行评估并返回测试结果。

    除了题目外,LeetCode还提供了讨论区、排行榜等社区功能,用户可以在这里交流学习心得、解决疑难问题,并与其他用户比较自己的做题成绩。

    挑战100天 AI In LeetCode是基于LeetCode题库,借助AI的能力进行解题、并学习其解题过程。

    二、LeetCode 热题 HOT 100-7

    2.1 题目

    N 字形变换

    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
    
    比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
    
    P   A   H   N
    A P L S I I G
    Y   I   R
    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
    
    请你实现这个将字符串进行指定行数变换的函数:
    
    string convert(string s, int numRows);
     
    
    示例 1:
    
    输入:s = "PAYPALISHIRING", numRows = 3
    输出:"PAHNAPLSIIGYIR"
    示例 2:
    输入:s = "PAYPALISHIRING", numRows = 4
    输出:"PINALSIGYAHRPI"
    解释:
    P     I    N
    A   L S  I G
    Y A   H R
    P     I
    示例 3:
    
    输入:s = "A", numRows = 1
    输出:"A"
     
    
    提示:
    
    1 <= s.length <= 1000
    s 由英文字母(小写和大写)、',''.' 组成
    1 <= numRows <= 1000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    2.2 题解

    这道题目需要我们将一个给定的字符串按照Z字形排列,并输出结果。

    解题思路:

    1. 首先,我们可以定义一个二维数组来存储排列后的字符串。
    2. 然后,我们可以按照Z字形排列的规律,将字符串中的字符逐个填充到数组中。
    3. 最后,我们按照从左到右的顺序,将数组中的字符依次取出并拼接成字符串输出即可。
    public class Solution {  
        public String convert(String s, int numRows) {  
            if (numRows == 1) {  
                return s;  
            }  
              
            StringBuilder[] rows = new StringBuilder[numRows];  
            for (int i = 0; i < numRows; i++) {  
                rows[i] = new StringBuilder();  
            }  
              
            int rowIndex = 0;  
            boolean goingDown = false;  
              
            for (char c : s.toCharArray()) {  
                rows[rowIndex].append(c);  
                  
                if (rowIndex == 0 || rowIndex == numRows - 1) {  
                    goingDown = !goingDown;  
                }  
                  
                rowIndex += goingDown ? 1 : -1;  
            }  
              
            StringBuilder result = new StringBuilder();  
            for (StringBuilder row : rows) {  
                result.append(row);  
            }  
              
            return result.toString();  
        }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    三、面试经典 150 题-7

    数组 / 字符串

    3.1 题目

    买卖股票的最佳时机

    给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
    
    你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
    
    返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
    
     
    
    示例 1:
    
    输入:[7,1,5,3,6,4]
    输出:5
    解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
         注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
    示例 2:
    
    输入:prices = [7,6,4,3,1]
    输出:0
    解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
     
    
    提示:
    
    1 <= prices.length <= 105
    0 <= prices[i] <= 104
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3.2 题解

    时间复杂度为 O(n),空间复杂度为 O(n)。

    解题思路:

    这个问题可以使用动态规划来解决。我们可以定义一个长度为 n 的数组 dp,其中 dp[i] 表示在价格为 prices[i] 的情况下,能获取的最大利润。

    考虑到买入和卖出的任意一天,有两种情况:

    如果选择第 i 天买入,那么必须选择在 i 之后的某一天卖出,假设卖出日期为 j。此时,利润为 prices[j] - prices[i]。但是,我们需要注意 j 必须大于 i,否则无法完成交易。
    如果不选择第 i 天买入,那么最大利润只能是前面的某个日期的最大利润。
    因此,我们可以得到状态转移方程:

    dp[i] = max(prices[i] - min(dp[i+1], dp[i+2], …, dp[n-1]), max(dp[0], dp[1], …, dp[i-1]))

    其中 min(dp[i+1], dp[i+2], …, dp[n-1]) 表示在未来的日子里能获取的最大利润,max(dp[0], dp[1], …, dp[i-1]) 表示在前面的日子里能获取的最大利润。

    最后,我们只需要返回 dp[n-1],即最后一个价格对应的最大利润。

    public int maxProfit(int[] prices) {  
        int n = prices.length;  
        int[] dp = new int[n];  
        dp[0] = 0;  
        int minPrice = prices[0];  
        for (int i = 1; i < n; i++) {  
            dp[i] = Math.max(prices[i] - minPrice, dp[i - 1]);  
            minPrice = Math.min(minPrice, prices[i]);  
        }  
        return dp[n - 1];  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    至此,挑战100天 AI In LeetCode Day05(热题+面试经典150题)完成,后续会持续调整;查阅过程中若遇到问题欢迎留言或私信交流。

  • 相关阅读:
    vscode环境配置:附注有参考链接,便于下载软件。
    【微服务】SpringCloud轮询拉取注册表及服务发现源码解析
    MAVEN-SNAPSHOT和RELEASE
    【题解笔记】PTA基础6-10:阶乘计算升级版
    面向对象实验一 类的建立与应用
    Java学习笔记 --- Collections工具类
    TCP通讯CS模式之C#设计笔记(十八)
    Spinner
    【再探】设计模式—备忘录模式与解释器模式
    CSS常用的基础知识点
  • 原文地址:https://blog.csdn.net/ith321/article/details/134286137