欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

小白学习打卡04

程序员文章站 2022-05-21 08:32:48
...

前两个题均出自LeetCode

知识点

  1. Python中 for _ in range(n)
    表示 不在乎变量值,只要求循环n遍,无法打印bian’liang

1.通配符匹配

题目描述:

给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何单个字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。

思路:

动态规划:
s中的小写字母对p中的小写字母:dp[i][j] =dp[i][j]
s中的小写字母对p中的?:dp[i][j]=dp[i][j-1]
s中的小写字母对p中的* : dp[i][j]=dp[i][j-1]
s为空 p为空:return ture
s为空 p为?: return false
s为空 p为* :return true
s不为空 p为空:return false

解答:
Class Solution:
    def toMatch(self,s:str, p:str)->bool:
    if (p==[]):
        if(s==[]):
            return True
        else:
            return False
    if(s==[]):
        if(p=="*"):
            return True
        else:
            return False
    for i in range(len(s)):
            for j in range(len(p)):
               
               
正确思路

dp[i][j]表示 s中前i个字符 p中前j个字符
dp[0][0]=True
dp[0][j]: 当前j个都是*,此时是True 否则是False
dp[i][0]=False

dp[i][j]=dp[i][j-1] or dp[i-1][j] Pj是*
dp[i][j]=dp[i-1][j-1] Si和Pj相同 或者 Pj是?

正确解答

class Solution:
def isMatch(self, s: str, p: str) -> bool:
m, n = len(s), len§
dp = [[False] * (n + 1) for _ in range(m + 1)]
dp[0][0] = True
for i in range(1, n + 1):
if p[i - 1] == ‘’:
dp[0][i] = True
else:
break
for i in range(1, m + 1):
for j in range(1, n + 1):
if p[j - 1] == '
’:
dp[i][j] = dp[i][j - 1] | dp[i - 1][j]
elif p[j - 1] == ‘?’ or s[i - 1] == p[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
return dp[m][n]
作者:LeetCode-Solution

2. 求所在子数组中最大值
题目描述

a=[2,-1,3,6,1,8]
前三个 :3 前四个:6

思路

当 dp[i - 1] > 0dp[i−1]>0 时:
执行 dp[i] = dp[i-1] + nums[i]
当 dp[i - 1] \leq 0dp[i−1]≤0 时:
执行 dp[i] = nums[i]
作者:jyd

解答
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        for i in range(1, len(nums)):
            nums[i] += max(nums[i - 1], 0)
        return max(nums)
class Solution {
    public int maxSubArray(int[] nums) {
        int r = nums[0];
        for(int i = 1; i < nums.length; i++) {
            nums[i] += Math.max(nums[i - 1], 0);
            r = Math.max(r, nums[i]);
        }
        return r;
    }
}

(ps:虽然代码看着很少 但是自己感觉理解起来还可以 但是用代码敲出来这个转化比较困难)

3.用递归的方法正序打印出数组元素
思路

用递归进行正序排序 随后打印

#include <stdio.h>
/*
题目:用递归正/逆序打印数组的元素,以及递归调用的过程理解
正序打印数组解题思路:第一:数组元素是连续的。知道第一个元素的地址,就能推算出第二个元素的地址。以此类推
                      第二:数组的结束条件:i = sizeof(arr)/4 -1; 此时的值为arr[sizeof(arr)/4-1];
                      第三:后一个元素的值的下标 = 前一个元素的值的下标+1 (通项公式)
*/
void arr1(int *p,int n,int *p1);
void arr2(int *p,int n);
int main(void)
{
    int arr[8] = {1,2,3,4,5,6,7,8};
    int k = 0;
    arr1(arr,0,&k);//正序
    printf("k = %d\n",k);//调用的返回过程
    arr2(arr,7);//逆序


    return 0;
}
//递归正序打印数组元素
void arr1(int *p,int n,int *p1)
{
    if(n == 7)//结束条件
        printf("%d\n",*(p+n));
    else
    {
        printf("%d\t",*(p+n));//打印当前元素
        arr1(p,n+1,p1);//继续调用自己,将首地址和偏移量发送出去。注意点:逐级返回的时候:返回arr1(p,n+1,p1); 分号后面  执行 (*p1)++; 然后执行} 在执行函数结束的}
        (*p1)++;            //即:返回执行调用语句后面的内容,直至函数结束。
    }
}
//递归逆序打印数组元素
void arr2(int *p,int n)
{
    if(n == 0)//结束条件
        printf("%d\n",*(p+n));
    else
    {
        printf("%d\t",*(p+n));//打印当前元素
        arr2(p,n-1);//继续调用自己,将首地址和偏移量发送出去。
    }
}

以上代码来自于博客园的王朝马汉

(ps:有时间还是自己用python试一下敲出来 )