当前位置: 首页 > news >正文

【Hello Algorithm】暴力递归到动态规划(四)

动态规划的数组压缩技巧 - 机器人走格子问题

题目是leetcode62题目原题 表示如下

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

在这里插入图片描述

递归版本

我们首先来想递归函数的含义 它会返回给我们一个int类型的数据 这个数据就是我们的最大路径数

我们需要给这个函数 我们当前的位置 我们需要去到的位置 整体函数如下

int _uniquePaths(int x , int y ,int m , int n)

其中 x y 代表我们当前位置的坐标 m n代表要到达位置的坐标

接下来我们想base case

因为这是一个位置限制的棋盘 所以说我们要考虑是否会越界的问题 即

        if (x > m || y > n){return 0;}

当然 当我们的走到finish位置的时候也算是结束了 会返回给我们一种路径方法 表示如下

        if (x == m && y == n){return 1;}

接下来我们就开始列举各种可能性 因为我们这里只能往下或者是往右走 所以说一共有两种可能性

我们只需要把这两种可能性所需要的路径和相加就可以了 代码表示如下

    int _uniquePaths(int x , int y ,int m , int n){// base caseif (x > m || y > n){return 0;}if (x == m && y == n){return 1;}int p1 = _uniquePaths(x + 1 , y, m,  n);int p2 = _uniquePaths(x, y + 1, m,  n);return p1 + p2;}

动态规划

接下来我们开始动态规划版本的代码改写

首先我们找出一直变化的变量是什么

 int _uniquePaths(int x , int y ,int m , int n)

我们发现递归中一直变化的参数其实只有两个 x 和 y

所以说我们只需要建立一张x和y的二维表就可以

x的格子一共有m个 y的格子一共有n个 所以说 x的大小可以设置为 0 ~ m-1 y的大小可以设置为0 ~ n-1

我们要知道的是 x和y可能会越界 所以说我们要设置一个pickup函数来从表中选值 如果说越界了我们直接返回0即可

   int pickup_dp(int x , int y , int m , int n , vector<vector<int>>& dp){if (x > m || y > n){return 0;}return dp[x][y];}

接下来我们来看base case

        if (x == m && y == n){return 1;}

也就是说 当x为最大值 y为最大值的时候 此时dp表设置为1

dp[m-1][n-1] = 1;

接下来我们开始找位置依赖关系

        int p1 = _uniquePaths(x + 1 , y, m,  n);int p2 = _uniquePaths(x, y + 1, m,  n);

假设这个格子是表中任意一个 图中表示为黑色的格子

在这里插入图片描述
那么依赖的格子就是红色的

根据依赖关系 我们可以从右往左 从下往上的方式 来填写依赖关系 代码表示如下

    int dp_uniquePaths(int m , int n , vector<vector<int>>& dp){dp[m-1][n-1] = 1;for (int col = n -1 ; col >= 0 ; col--){for (int row = m -1; row >= 0; row--){if (row == m-1 && col == n-1){continue;}int p1 = pickup_dp(row + 1, col, m, n, dp);int p2 = pickup_dp(row , col + 1,  m,  n, dp);dp[row][col] = p1 + p2; }}return dp[0][0];}

这就是这道题目的动态规划解法

数组压缩技巧

我们可以发现的是 其实每个格子都只依赖于该列和它的右边一列 那么我们就可以使用两个列来表示整个二维表

也就是二维表转化为一维表 节省一定的空间

压缩技巧也很简单 只需要一列一列的转化就可以

代码表示如下

class Solution {
public:int pickup_dp(int x , int m , vector<int>& dp){if (x >= m || x < 0){return 0;}return dp[x];}int dp_uniquePaths(int m , int n ){// col1 prev // col2 curvector<int> col1(m , 0);vector<int> col2(m , 0);col1[m-1] = 1;for (int i = 0; i < n ; i++){for(int j = m - 1; j >= 0; j--){col2[j] = pickup_dp(j + 1, m, col2) + col1[j]; }for(int j = m -1 ; j >= 0 ; j--){col1[j] = col2[j];}}return col2[0];}int uniquePaths(int m, int n) {return dp_uniquePaths(m  , n );}
};

我们这里稍微讲解下两列的转化思路

我们设定 col1为前一列 col2为当前列

每次我们修改col2内部的值 到最后我们全部修改完毕要到下一列的时候 我们更新下col1列的所有值

钱包问题一

我们给定一个数组 arr 数组里面的值表示任意一张面值的钞票

每张钞票代表的值可能相同 但是我们认为它们是不同的钞票

现在我们给定一个 val 值 请问有多少种组合方案可以让val值为0

递归解法

还是一样 我们首先来想函数

它要返回给我们一个组合的最大值 所以说我们的返回值要是一个int类型的数值

我们要遍历整个money数组 所以说我们需要这个数组和一个index参数来遍历

接着我们需要一个rest参数来记录剩余零钱的数目

整体函数如下

int process(vector<int>& money , int index , int rest)

接下来我们开始想base case

这道题目中有两个变化的量 我们首先向有没有可能会因为index而终止递归呢?

当然有 如果index越界了 那么我们的递归也就终止了

有没有可能因为rest而终止递归呢 ?

当然有 如果剩余零钱的数目为0 我们就终止递归了

  if (rest < 0)    {    return 0;    }    int N = static_cast<int>(money.size());    if (index == N)    {    return rest == 0 ? 1 : 0;    }    

接下来开始列举可能性 对于这种从左往右的模型来说 可能性就是要和不要两种情况

所以说我们直接列出这两种可能性之后想加即可

int process(vector<int>& money , int index , int rest)    
{    if (rest < 0)    {    return 0;    }    int N = static_cast<int>(money.size());    if (index == N)    {    return rest == 0 ? 1 : 0;    }    int p1 = process(money , index + 1 , rest);    int p2 = process(money , index +1 , rest - money[index]);    return p1 + p2;    
} 

动态规划

我们首先观察递归函数

int process(vector<int>& money , int index , int rest)  

我们可以发现 其中变化的变量有 index 和 rest

所以说我们可以围绕着index 和 rest建立一张二维表

index 的大小是 0 ~ index 大小是index + 1

rest 的大小是 0 ~ rest 大小是rest + 1

我们建立完一个二维表之后就可以根据base case填写数据了

根据

 if (index == N)    {    return rest == 0 ? 1 : 0;    }    

我们可以得出

 dp[N][0] = 1;  

接着我们来看位置依赖关系

在这里插入图片描述

它依赖于下面一行的两个格子

所以说我们从最下面的倒数第二行开始填写数据 为了防止越界问题 我们再写一个pickup函数

完整代码如下

int dpprocess(vector<int>& money , int rest)    
{    int N = static_cast<int>(money.size());    vector<vector<int>> dp(N + 1 , vector<int>(rest + 1 , 0));    dp[N][0] = 1;    for (int row = N - 1;  row >= 0; row--){    for (int col = 0; col <= rest; col++)    {dp[row][col] = pickupdp(row + 1 , col , dp , N , rest) + pickupdp(row + 1 , col - money[row] , dp , N , rest);}}return dp[0][rest];
}

钱包问题二

我们给定一个数组 arr 数组里面的值表示任意一张面值的钞票 arr内部值不同

每一个arr中的元素代表有无数张钞票

现在我们给定一个 val 值 请问有多少种组合方案可以让val值为0


这个问题和问题一的区别就是 在问题2中 我们的钱包有无数张钞票 只是它们的面值不同 要我们求解法

递归版本

我们首先来想 我们要写什么样的一个递归函数

我们要让这个函数返回一个最大的组合方案 所以返回值是一个int类型的数据

而我们要在一个数组中选取数据 所以自然而然的想到使用index遍历

最后我们还需要一个rest来表示剩余值 整体表示如下

int process(vector<int>& money , int index , int rest)

接着就是想base case 这一步照抄钱包问题一即可

到了列举可能性的这一步就有点意思了

此时的问题就从要不要变为了两个问题

  • 要不要?
  • 要的话要几个

所以说我们的代码也要转变下

  int p1 = process(money , index + 1 , rest);    // how many ? int p2 = 0;    for (int fix = 1 ; fix * money[index] <= rest; fix++)    {    p2 += process(money , index + 1 , rest - fix * money[index]);    }   

可能性1就是我们不要这种类型的钞票了

可能性2就是我们要这种类型的钞票 一张张枚举 知道rest小于0为止

当然我们其实可以让fix从0开始 这样就不需要可能性1了

整体代码表示如下

int process(vector<int>& money , int index , int rest)
{if (rest < 0){return 0;}int N = static_cast<int>(money.size());if (index == N){return rest == 0 ? 1 : 0;}int p1 = process(money , index + 1 , rest);    // how many ? int p2 = 0;    for (int fix = 1 ; fix * money[index] <= rest; fix++)    {    p2 += process(money , index + 1 , rest - fix * money[index]);    }    return p1 + p2;    
}   

动态规划

我们首先观察递归函数

int process(vector<int>& money , int index , int rest)

我们可以发现 变量只有index 和rest

所以我们可以围绕着index和rest来做一张二维表

index 的大小是 0 ~ index 大小是index + 1

rest 的大小是 0 ~ rest 大小是rest + 1

我们建立完一个二维表之后就可以根据base case填写数据了

根据

 if (index == N)    {    return rest == 0 ? 1 : 0;    }    

我们可以得出

 dp[N][0] = 1;  

接下来我们来看为止依赖关系

在这里插入图片描述

我们可以发现这个位置依赖于下面一行的数据具体的格子数目不确定

所以说我们就可以写出这样子的代码

  for (int row = N - 1; row >= 0; row--)    {    for(int col = 0; col <= rest; col++)    {    int ways = 0;    for (int fix = 0; fix * money[row] <= rest; fix++)    {    ways += pickupdp(row + 1 , col - fix * money[row] , dp , N  , rest );    }    dp[row][col] = ways;                                                                                                        }    }    

动态规划优化

我们还是来观察下图

在这里插入图片描述

我们可以发现蓝色格子依赖的红色格子其实只比黑色格子依赖的红色格子少一个

也就是说我们可以这么转化

黑色格子依赖于蓝色格子和它下面的一个红色格子

于是我们的代码就可以这样子改写

int dpprocess(vector<int>& money , int rest)    
{    int N = static_cast<int>(money.size());    vector<vector<int>> dp(N + 1 , vector<int>(rest + 1 , 0));    dp[N][0] = 1;    for (int row = N - 1; row >= 0; row--)    {    for(int col = 0; col <= rest; col++)    {    dp[row][col] = pickupdp(row , col - money[row] , dp , N ,rest) + pickupdp(row + 1 , col , dp , N , rest);                   }    }    return dp[0][rest];    
}  

这样子我们就把原来的三个for循环优化成为了两个for循环 效率提高了不少

钱包问题三

我们给定一个数组 arr 数组里面的值表示任意一张面值的钞票 arr内部有相同值的钞票 我们认为值相同的钞票位置可以随意替换 (和题目一不同 题目一中每张钞票都是不同的 )

现在我们给定一个 val 值 请问有多少种组合方案可以让val值为0

这问题其实是题目二的变形

这里我提供一种思路将其转化为题目二 具体的代码大家可以自己尝试下

我们统计有多少种不同的钞票 并且将这些钞票添加到一个数组中

统计每个钞票的数目 再做一个数组

其中 第一个数组的用途和钱包问题二中的用途一样 而第二个数组则约束了每张钞票最多能取多少

之后按照钱包问题二的思路去做即可

相关文章:

【Hello Algorithm】暴力递归到动态规划(四)

动态规划的数组压缩技巧 - 机器人走格子问题 题目是leetcode62题目原题 表示如下 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中…...

arm day 8

arm 写一段按键中断代码 main.c #include "uart.h" #include "key_it.h" int main() {char c;char *s;uart4_init();//串口初始化//中断初始化key_it_config();while(1){//保证主程序不结束}return 0; } src/key_it.c #include"key_it.h"voi…...

k8s-14 存储之volumes

Volumes配置管理 容器中的文件在磁盘上是临时存放的&#xff0c;这给容器中运行的特殊应用程序带来一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 将重新启动容器&#xff0c;容器中的文件将会丢失因为容器会以干净的状态重建。其次&#xff0c;当在一个 Pod 中…...

二分图博弈

一张二分图&#xff0c;Alice和Bob每人走一步&#xff0c;不能重复走&#xff0c;谁不能走谁输 结论&#xff1a;若存在最大匹配不包含初始点&#xff0c;则Bob赢&#xff0c;否则Alice赢 以上图为例&#xff0c;红色为最大匹配。 首先对于Alice第一步只能走黑边。而Alice无论…...

【C++】C++11—— 包装器

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】C11…...

LED显示屏高刷新率和低刷新率有什么区别

LED显示屏的刷新率是指图像在LED显示屏上更新的速度&#xff0c;也即屏幕上的图像每秒钟出现的次数&#xff0c;它的单位是赫兹&#xff08;Hz&#xff09;。LED显示屏的刷新率越高&#xff0c;图像闪烁感就越小&#xff0c;稳定性也就越高&#xff0c;换言之对视力的保护也越好…...

国际伦敦银点差费值得吗?

伦敦银是国际轨技术属市场上广受追捧的白银保证金交易品种&#xff0c;具有交易时长、交易制度灵活、资金利用率高等诸多的优点。 国际伦敦银的优势主要来自它所实行的是保证金交易制度。目前香港平台一般执行的保证金比例标准是2%&#xff0c;以目前22美元/盎司左右的白银价格…...

常见的作物模型应用技巧!DSSAT模型、APSIM模型、WOFOST模型与PCSE模型等应用

①最新DSSAT作物模型建模方法及应用 DSSAT模型内核算法是基于Fortran语言开发的&#xff0c;软件界面是基于C进行开发。了解和熟悉DSSAT模型的关键算法和软件的操作是学习DSSAT模型的基础。此外&#xff0c;想要成为一名优秀的作物模型使用者与科研团队不可或缺的人才&#xff…...

2023年中国超硬材料制品分析及超硬刀具市场规模分析[图]

超硬材料是指硬度特别高的材料&#xff0c;可分为天然以及人造两种&#xff0c;前者主要包括天然的钻石&#xff08;金刚石&#xff09;、黑钻石&#xff0c;后者则包括人造金刚石、立方氮化硼。 超硬材料制品分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#x…...

使用React、Express实现一个问卷发布/收集系统

1. 设置项目结构 questionnaire-system/client/ // 前端应用src/components/ // React组件pages/ // 页面App.jsindex.jsserver/ // 后端服务routes/ // 路由models/ // 数据模型app.jspackage.json2. 启动前端应用…...

DDD之上下文映射图(Context Mapping)

领域驱动设计系列文章&#xff0c;点击上方合集↑ 1. 开头 在DDD中&#xff0c;限界上下文与限界上下文之间需要相互集成&#xff0c;这种集成关系在DDD中称为上下文映射&#xff08;Context Mapping&#xff09;&#xff0c;也就是子域与子域之间的集成关系。 所以首先我们…...

CountDownLatch的原理

使用CountDownLatch可以实现等待多个线程执行完毕的功能&#xff0c;实现线程之间的协调&#xff0c;让它们按照我们期望的顺序执行&#xff0c;从而避免了可能出现的并发问题。 CountDownLatch是如何实现主线程等待子线程全部结束的呢&#xff1f; 代码用例 这里我们使用一段…...

Java新特性Stream流详解

一、概述 Stream流是Java 8 API添加的一个新的抽象&#xff0c;以一种声明性方式处理数据集合&#xff08;侧重对于源数据计算能力的封装&#xff0c;并且支持序列与并行两种操作方式&#xff09;。 Stream流是对集合&#xff08;Collection&#xff09;对象功能的增强&#xf…...

关于VScode中一些常用的快捷操作!

vscode CTRLO&#xff1a;打开文件夹以开始工作 先CTRLK 再CTRLO&#xff1a;打开文件夹以开始工作 如何选择workspace&#xff1a;file → open folder→选目标文件夹【当前工作区选择会影响代码是否能运行】 如何打开终端&#xff1a;View → terminal debug看不到变化历史&…...

Django 使用Mysql数据库

目录 Django 使用Mysql数据库本地安装Mysql数据服务安装好Pymysql服务Django配置数据库迁移各种报错无法找到mysqlclient数据库拒绝连接 Django 使用Mysql数据库 本地安装Mysql数据服务 安装好Pymysql服务 python3 -m pip install PyMySQL官方文档介绍 Django配置 官网文档 …...

js继承的几种方式(原型链继承、构造函数继承、组合式继承、寄生组合式继承、ES6的Class类继承)

1.原型链继承 实现原理&#xff1a;子类的原型指向父类实例。子类在自身实例上找不到属性和方法时去它父类实例&#xff08;父类实例和实例的原型对象&#xff09;上查找&#xff0c;从而实现对父类属性和方法的继承 缺点&#xff1a; 子类创建时不能传参&#xff08;即没有…...

AnyTransition/过渡动画, MatchedGeometryEffect/匹配几何动画效果 的使用

1. AnyTransition 过渡动画效果 1.1 创建过度动画案例 AnyTransitionBootcamp.swift import SwiftUI/// 旋转修饰 View struct RotateViewModifier :ViewModifier{let rotation: Doublefunc body(content: Content) -> some View {content.rotationEffect(Angle(degrees: r…...

mac版postman升级后数据恢复办法

postman升级了一下&#xff0c;所有的collections都丢失了。 首先在finder里找到这个路径 /Users/{用户名}/Library/Application Support/Postman找到升级之前的的最新的backup.json&#xff0c;然后在postman里import这个文件。 所有升级前的collections都恢复了&#xff0…...

四.镜头知识之放大倍率

四.镜头知识之放大倍率 文章目录 四.镜头知识之放大倍率4.0 前言4.1 镜头的光学放大倍率的计算方法4.2 显示器的电子放大倍率4.2.1 智能硬件产品的显示放大倍率计算案例4.3 系统放大倍率4.4 智能硬件产品的系统放大倍率计算案例4.4 智能硬件产品的系统放大倍率计算案例4.0 前言…...

Jenkins UI 自动化持续化集成测试

一&#xff1a;安装jenkins 环境 在官网下载msi 直接安装即可 二&#xff1a;设置全局变量 设置allure 路径 三&#xff1a;创建项目 1、创建自由风格项目 2、如果项目在本地&#xff0c;且本地服务器是windows &#xff0c;找到Jenkins安装根目录&#xff0c;寻找config…...

vue项目中引入地图的详细教程

第一步&#xff1a;在项目中安装地图插件 npm i amap/amap-jsapi-loader --save 第二步&#xff1a;创建一个容器 添加id属性 &#xff08;因为地图必须使用id 不能使用class&#xff09; <div id"maps"></div> 第三步&#xff1a;给这个容器设置宽…...

MyBatisPlus 多数据源配置

目录 一、mybatis-plus 简介 特性 二、支持数据库&#xff1a; 三、 开发实例 1. 引入依赖&#xff1a; 2. 参数配置application.yml 3. 在 Spring Boot 启动类中添加 MapperScan 注解&#xff0c;扫描 Mapper 文件夹&#xff1a; 4. 编写实体类 User.java&#xff08;此处…...

使用Golang实现HTTP代理突破IP访问限制

引言 在当今互联网时代&#xff0c;网站和服务商为了维护安全性和保护用户隐私&#xff0c;常常会对特定的IP地址进行封锁或限制。但是&#xff0c;有时候我们可能需要访问这些被限制的网站或服务。为了突破这种限制&#xff0c;我们可以使用HTTP代理来隐藏真实的客户端IP地址…...

Iterator和ListIterator的区别是什么?

Iterator 和 ListIterator 都是 Java 集合框架中的迭代器,其中 Iterator 是普遍适用于所有实现了 Iterable 接口的集合类的通用迭代器,而 ListIterator 则是专门用于遍历 List 集合的迭代器,它比 Iterator 更加强大,而且只适用于 List 集合。 以下是 Iterator 和 ListItera…...

大坑-MATLAB图片转存时需注意的点

MATLAB中图片的保存和转存有一个巨大的陷阱&#xff0c;我也是在吃了大亏后发现的&#xff0c;正常情况下&#xff0c;MATLAB跑完实验&#xff0c;生成的图片如下 放大后这样 可以方便修改坐标轴标题&#xff0c;最初我就是因为想修改坐标轴标题才给它放大的&#xff0c;因为…...

基于Lang-Chain(ChatGLM和ChatChat)知识库大语言模型的部署搭建

环境准备 阿里云个人认证后&#xff0c;可免费试用机器学习平台PAI&#xff0c;可提供适合大语言模型环境搭建的高配置服务器。 点击试用阿里云服务器 试用产品选择&#xff1a;选择交互式建模PAI-DSW 适合哪些场景 文章/知识库/帮助文档等的检索基于现有知识库实现问答… …...

个人轻博客PHP开源系统/溯雪Sxlog轻博客源码/洁干净轻/占内存极低/php源码

源码简介&#xff1a; 溯雪(sxlog)它是一款很简洁越低内存的轻博客程序&#xff0c;整个程序包不到200KB&#xff0c;占内存极小&#xff0c;比一张照片都要小很多。简洁高效&#xff0c;占用空间内存极小&#xff0c;而且它不依赖任何数据库&#xff0c;不依赖富文本编辑器&a…...

2.Vue-从零开始搭建一个vue项目

题记 从零开始搭建一个vue项目&#xff0c;以下是操作的全过程。 安装Vue CLI脚手架 打开终端&#xff0c;运行以下命令全局安装Vue CLI脚手架&#xff1a; npm install -g vue/cli 查看 Vue CLI脚手架版本&#xff1a; vue -V 注意&#xff1a;查看vue版本的命令不是vue -V&a…...

快速构建代理应对

今天我要和大家分享一个解决反爬策略升级问题的方法&#xff0c;那就是快速构建代理池。如果您是一位爬虫开发人员&#xff0c;一定深知反爬策略的烦恼。但是&#xff0c;通过构建代理池&#xff0c;您可以轻松地应对反爬策略的升级&#xff0c;让您的爬虫持续高效运行。接下来…...

【LeetCode刷题(数据结构)】:另一颗树的子树

给你两棵二叉树 root 和 subRoot 检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子…...

西安有哪些做网站建设的公司好/网络推广员好做吗

在接口测试学习过程中&#xff0c;遇到了利用requests库进行文件下载和上传的问题。同样&#xff0c;在真正的测试过程中&#xff0c;我们不可避免的会遇到上传和下载的测试。文件上传&#xff1a;url ztx.hostupload/uploadFile?CSRFTokenself.getCSRFToken()#上传文件的接口…...

wordpress 中文编辑器/网络营销专业是做什么的

概述 Executors类是JDK 1.5开始自带的一个非常强大的主要用于创建各类线程池的工具类。 常用方法介绍 newFixedThreadPool newFixedThreadPool方法有两种函数签名&#xff1a; 1 2public static ExecutorService newFixedThreadPool(int nThreads) public static ExecutorSe…...

商丘网站建设方案/长沙百度首页优化排名

前段时间看到在V公司工作的朋友们都开始使用Mac电脑了。 一直对苹果电脑充满向往的我&#xff0c;实在是好心动&#xff08;同时伴随着一小股心痛&#xff0c;只有一小股…这得花多少银子呀…虽然我用得也是Mac….&#xff09; 堆得小山般的Apple iPAD 批量安装Mac Book Pro系统…...

合肥网站制作建设/营销型网站有哪些功能

文章目录引言I、 上架指南1.1 iOS上架干货汇总1.2 上架相关操作技巧1.3 iOS被拒绝的解决方案汇总1.4 系统框架(API)适配II、 开发基础知识III、渲染3.1 动画3.2 文字/图像处理3.2.1 Quartz2D使用指南IV、 网络与数据存储4.1 数据存储4.2 数据搜索4.3 http/https/dns&#xff08…...

公司网站建设开源平台/软文的概念是什么

map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数&#xff0c;返回包含每次 function 函数返回值的新列表。 列表转换字符串输出测试&#xff1a; 1 list1 [abc, DEF, 123]2 list2 map(str, list1)3 # 使用str() 把…...

西宁网站制作哪里好/新媒体营销案例ppt

属性striped设置为true&#xff0c;即striped:true。 如果想更改颜色&#xff0c;可以更改easyui.css中的.datagrid-row-alt样式。转载于:https://www.cnblogs.com/hubing/p/3969599.html...