【LeetCode与《代码随想录》】贪心算法篇:做题笔记与总结-JavaScript版
代码随想录
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。
文章目录
- 455. 分发饼干
- 376. 摆动序列
- 53. 最大子数组和
- 122. 买卖股票的最佳时机 II
- 55. 跳跃游戏
- 45. 跳跃游戏 II
- 1005. K 次取反后最大化的数组和
- 134. 加油站
- 135. 分发糖果(困难)
- 860. 柠檬水找零
- 406.根据身高重建队列
- 452. 用最少数量的箭引爆气球
- 435. 无重叠区间
- 763.划分字母区间
- 56. 合并区间
- 738.单调递增的数字
- 968.监控二叉树
455. 分发饼干
https://leetcode.cn/problems/assign-cookies/description/
大饼干可以满足大孩子也可以满足小孩子,在这里显然是满足大孩子最划算。因此饼干从大到小,如果饼干可以满足该孩子,ans++,否则,尝试是否可以满足小孩子。
注意跳出循环的条件,当i<0||j<0
var findContentChildren = function (g, s) {g.sort((a, b) => (a - b))s.sort((a, b) => (a - b))let ans = 0;for (let i = g.length - 1, j = s.length - 1; i >= 0, j >= 0;) {// g[i] 人 s[j]饼干if (s[j] >= g[i]) {ans++;i--, j--;} else {i--;}if (i < 0 || j < 0) break;}return ans;
};
376. 摆动序列
376. 摆动序列
想要得到最长的摆动数组,需要保留一个上/下坡的头和尾,如:
1,2,5,7,5,2,1
这里1,2,5,7
都是上坡,但1,7
的上坡比其他的好,因为7可以与后面组成更好的下坡——若是1,7
,则后面想要下坡<7即可;若1,2
,后面想要下坡则需要<2
,条件比<7
要小。反之亦然。
但是,选择1,7
还是1,2
本质都是上坡,且长度都为2。因此,我们可以把问题简化为数组有多少个上下坡的变化。
上面的样例就是一上一下,不管怎么选摆动数组都是3.
我们用一个flag来记录前面是上坡还是下坡:前面是上坡且当前数组是下坡则ans++,反之亦然。
注意要判断平坡,且从第一个上/下坡之后开始(flag值就记录第一个上/下坡)。
var wiggleMaxLength = function(nums) {// flag表示是上行1还是下行0,-1表示一直平坡let ans=1,flag=-1;// 要找到第一次上行或下行let index=1;for(;index<nums.length;index++){if(nums[index]===nums[index-1]) continue;if(nums[index]>nums[index-1]) {flag=1;ans=2;break;}else{flag=0;ans=2;break;}}for(let i=index+1;i<nums.length;i++){// 上行if(nums[i]>nums[i-1]){if(!flag){ans++;flag=1;}}// 下行else if(nums[i]<nums[i-1]){if(flag){ans++;flag=0;}}}return ans;
};
53. 最大子数组和
53. 最大子数组和
分为两种情况:数组全负和数组非全负。
数组全负则选元素最大的那一个。
数组非全负则一直累加并存最大值,若出现cnt<0则令cnt=0,相当于前面部分都不选。
var maxSubArray = function (nums) {let ans = -10001;// 数组全为负数let flag = 0;nums.forEach(item => {if (item > 0) {flag = 1; return;}})if (!flag) {nums.forEach(item => {ans = Math.max(ans, item);})return ans;}let cnt = 0;// 贪心:如果一块连续部分是负数则舍去nums.forEach(item => {cnt += item;if (item >= 0) ans = Math.max(ans, cnt);else {if (cnt < 0) cnt = 0;}})return ans;
};
122. 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 II
有prices数组:1,2,3,5,8
最低买入最高卖出肯定是答案,即8-1=7
注意,8-1=(2-1)+(3-2)+(5-3)+(8-5)。即前缀差中正值的和。
若数组为:2,0,1,4
,前缀差为-2,1,3
,说明要在0时买入,在4时卖出。
var maxProfit = function (prices) {// 前缀差 差值为正表示利润let ans = 0;for (let i = 1; i < prices.length; i++) {let temp = prices[i] - prices[i - 1]if (temp > 0) ans += temp;}return ans;
};
55. 跳跃游戏
55. 跳跃游戏
var canJump = function (nums) {// cover表示可以覆盖的范围,也就是下标let cover = 0;if (nums.length === 1) return true;for (let i = 0; i <= cover; i++) {cover = Math.max(cover, i + nums[i]);if (cover >= nums.length - 1) return true;}return false;
};
45. 跳跃游戏 II
45. 跳跃游戏 II
var jump = function (nums) {if (nums.length === 1) return 0;// ans步数,next本次可以到达的最大范围,max下一次可以到达的最大范围let ans = 0, next = 0, max = 0;for (let i = 0; i < nums.length; i++) {max = Math.max(max, i + nums[i]);// 当前已经达到本次可以达到的最大范围,到下一范围需要一步if (i === next) {ans++;next = max;if (max >= nums.length - 1) break;}}return ans;
};
1005. K 次取反后最大化的数组和
1005. K 次取反后最大化的数组和
var largestSumAfterKNegations = function (nums, k) {// k是偶数可以相当于不变let f = [], z = []nums.forEach(item => {if (item < 0) f.push(item);else z.push(item);})f.sort((a, b) => (a - b));z.sort((a, b) => (a - b));if (k >= f.length) {k -= f.length;f = f.map(item => {return -item;})z.push(...f);f = []} else {for (let i = 0; i < k; i++) {let temp = -f[i];z.push(temp);}f = f.slice(k);k = 0;}f.sort((a, b) => (a - b));z.sort((a, b) => (a - b));if (k && k % 2) {// k是奇数z[0] = -z[0];}let ans = 0;if (f.length) {ans += f.reduce((pre, val) => {return pre + val;})}if (z.length) {ans += z.reduce((pre, val) => {return pre + val;})}return ans;
};
134. 加油站
134. 加油站
n是1e5,暴力双层循环会超出时间限制。
获得数组arr=gas-cost,arr[i]表示离开i地点剩余的油。
遍历arr,计算区间和,但凡出现区间和<0,说明不能从这个区间的开头开始走(没油了),可能从此区间的下一个地方j开始走。于是从j开始计算区间和。维护这个j值:是可能的答案。
计算arr的和,若arr的和>0,说明存在一个地方开始走能顺时针跑完。由题知,这个答案是唯一的。因此就是上面维护的j值。
若arr<0,说明不存在答案。
var canCompleteCircuit = function (gas, cost) {// 遍历 找gas-cost的区间和<0 答案就是此区间的下一个let curSum = 0, allSum = 0, ans = 0;for (let i = 0; i < gas.length; i++) {let temp = gas[i] - cost[i];curSum += tempallSum += temp// 此区间和为负,不能从这个区间和的头开始if (curSum < 0) {curSum = 0;ans = i + 1;//从此区间的下一个下标开始尝试}}if (allSum < 0) return -1;return ans;
};
135. 分发糖果(困难)
135. 分发糖果
思路:这个讲得好
省流:从左到右遍历一次,从右到左遍历一次。
var candy = function (ratings) {let arr = new Array(ratings.length).fill(1)// 右边大于左边,即从左到右:右边大的糖果+1for (let i = 1; i < ratings.length; i++) {if (ratings[i] > ratings[i - 1]) {arr[i] = arr[i - 1] + 1;}}// 左边大于右边,即从右到左(右边最小)for (let i = ratings.length - 1; i >= 0; i--) {if (ratings[i - 1] > ratings[i]) {arr[i - 1] = Math.max(arr[i - 1], arr[i] + 1);}}let ans = arr.reduce((pre, val) => {return pre + val;})return ans;
};
860. 柠檬水找零
860. 柠檬水找零
forEach
中的return
是跳出循环而不是函数的return
。
var lemonadeChange = function (bills) {let cnt5 = 0, cnt10 = 0;let flag = true;bills.forEach(item => {console.log(item, cnt5, cnt10)if (item === 5) {cnt5++;} else if (item === 10) {cnt10++;if (cnt5 > 0) cnt5--;else {flag = false; return;//这里的return是跳出bills的循环 而不是函数的return}} else if (item === 20) {if (cnt5 > 0 && cnt10 > 0) {cnt5--; cnt10--;} else if (cnt5 >= 3) {cnt5 -= 3;} else {flag = false; return;}}})return flag;
};
406.根据身高重建队列
406.根据身高重建队列
想要队列queue中的内容满足:第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人,只需要构造:
- 前面的人都比第i个人高
- 前面的人的个数是k[i]
因此,需要先对身高从大到小排列,若身高相同,则对k从小到大排列。(如,[5,0]一定在[5,1]前)
以[[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
为例,排序后为:
[ [ 7, 0 ], [ 7, 1 ], [ 6, 1 ], [ 5, 0 ], [ 5, 2 ], [ 4, 4 ] ]
开始构造:
- 对
[ 7, 0 ]
,前面有0个比它高的,因此他在第0个,这里的0即people[0][0] - 对
[ 7, 1 ]
,前面有1个比它高的,因此他在第1个,这里的0即people[1][1] - 对
[ 6, 1 ]
,前面有1个比它高的,因此他在第1个,这里的1即people[2][1] - 对
[ 5, 0 ]
,前面有0个比它高的,因此他在第0个,这里的0即people[3][1]
以此类推。
每次的queue为:
i为 0 , [ [ 7, 0 ] ]
i为 1 , [ [ 7, 0 ], [ 7, 1 ] ]
i为 2 , [ [ 7, 0 ], [ 6, 1 ], [ 7, 1 ] ]
i为 3 , [ [ 5, 0 ], [ 7, 0 ], [ 6, 1 ], [ 7, 1 ] ]
i为 4 , [ [ 5, 0 ], [ 7, 0 ], [ 5, 2 ], [ 6, 1 ], [ 7, 1 ] ]
i为 5 , [ [ 5, 0 ], [ 7, 0 ], [ 5, 2 ], [ 6, 1 ], [ 4, 4 ], [ 7, 1 ] ]
总体代码:
var reconstructQueue = function (people) {// 先看h,h从大到小,若h一样看k,从小到大people.sort((a, b) => {if (a[0] != b[0]) return b[0] - a[0];else return a[1] - b[1];})let queue = []for (let i = 0; i < people.length; i++) {queue.splice(people[i][1], 0, people[i]);}return queue;
};
452. 用最少数量的箭引爆气球
452. 用最少数量的箭引爆气球
var findMinArrowShots = function (points) {let ans = 1;// 都从小到大排points.sort((a, b) => {if (a[0] != b[0]) return a[0] - b[0];else return a[1] - b[1];})let min = points[0][0], max = points[0][1];for (let i = 1; i < points.length; i++) {let a = points[i][0], b = points[i][1];if (a >= min && b <= max) {min = amax = b} else {if (a >= min && a <= max) min = aelse if (b >= min && b <= max) max = belse {ans++;min = a, max = b;}}}return ans;
};
435. 无重叠区间
435. 无重叠区间
var eraseOverlapIntervals = function (intervals) {intervals.sort((a, b) => {if (a[0] != b[0]) return a[0] - b[0]else return a[1] - b[1]})let ans = 0let min = intervals[0][0], max = intervals[0][1]for (let i = 1; i < intervals.length; i++) {let a = intervals[i][0], b = intervals[i][1]if (a >= max) {min = a, max = b} else {ans++;if (a >= min && b <= max) {min = a, max = b;}}}return ans;
};
763.划分字母区间
763.划分字母区间
var partitionLabels = function (s) {let start = new Map(), end = new Map()for (let i = 0; i < s.length; i++) {// 注意:只有一个的情况end.set(s[i], i);if (!start.has(s[i])) start.set(s[i], i);}let arr = [...start.keys()], nums = []arr.forEach(item => {nums.push([start.get(item), end.get(item)])})// 从小到大nums.sort((a, b) => {if (a[0] != b[0]) return a[0] - b[0]else return a[1] - b[1]})let min = nums[0][0], max = nums[0][1], ans = []for (let i = 1; i < nums.length; i++) {let a = nums[i][0], b = nums[i][1]if (a > max) {ans.push(max - min + 1)min = a, max = b} else max = Math.max(max, b);}ans.push(max - min + 1)return ans;
};
56. 合并区间
56. 合并区间
var merge = function (intervals) {// 从小到大intervals.sort((a, b) => {if (a[0] != b[0]) return a[0] - b[0]else return a[1] - b[1]})let min = intervals[0][0], max = intervals[0][1], ans = []for (let i = 1; i < intervals.length; i++) {let a = intervals[i][0], b = intervals[i][1];if (a >= min && b <= max) continue;if (a > max) {ans.push([min, max])min = a, max = b;} else max = b;}ans.push([min, max])return ans;
};
738.单调递增的数字
738.单调递增的数字
var monotoneIncreasingDigits = function (n) {let str = n.toString()str = str.split('').map(item => {return Number(item)});// 找到第一个不是递增的位置let flag;for (let i = str.length - 1; i >= 0; i--) {if (str[i - 1] > str[i]) {flag = istr[i - 1]--;str[i] = 9}}for (let i = flag; i < str.length; i++) str[i] = 9return Number(str.join(''))
};
968.监控二叉树
968. 监控二叉树
困难先跳了。
相关文章:
【LeetCode与《代码随想录》】贪心算法篇:做题笔记与总结-JavaScript版
代码随想录 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 文章目录 455. 分发饼干376. 摆动序列53. 最大子数组和122. 买卖股票的最佳时机 II55. 跳跃游戏45. 跳跃游戏 II1005. K 次取反后最大化的数组和134. 加油站135. 分发糖果(困难&#…...
Http客户端OkHttp的基本使用
简介 OkHttp是一个强大的开源HTTP客户端,它被广泛用于Android和Java应用程序中。OkHttp具有简单易用的API,提供了许多高级功能,如连接池、请求压缩和缓存等。 依赖 要使用OkHttp,需要在项目的构建文件中添加以下依赖࿱…...
认识网线上的各种参数标号
最近工作需要,接触了很多不同类型的网线,为了能够区分不同型号的网线,特意做一篇笔记用来学习,如有记录有误之处,欢迎大家指正~初步认识网线 常用的网络电缆有三种:双绞线、同轴电缆和光纤电缆(…...
软件测开记录(一)
知识点汇总 14:00面试,14:06就出来了,问的问题有点变态。。。 python自动化测试学习路线(从入门到精通) 单元知识点 测试常用工具 常用的客户端和服务器端开发和测试工具 服务器与客户端常用测试工具与…...
基数排序之代码解析
基数排序是生活中咱们写程序用的比较少的排序,但是这个排序比较巧妙,今天就给大家讲一讲,原理都在代码里面,下面会给一些解释。 import java.util.Arrays;public class Code04_RadixSort {// only for no-negative valuepublic s…...
使用C语言EasyX 创建动态爱心背景
简介 在计算机图形学的世界中,有很多方法可以使程序的界面更加吸引人。在本篇博客中,我将向大家介绍如何使用 EasyX 图形库在 C 中创建一个动态的爱心背景。这不仅是一个简单的动画效果,它还包括背景的星星、旋转的心形以及一个美观的背景渐…...
springboot redisTemplate.opsForValue().setIfAbsent返回null原理
一、版本 springboot版本:spring-boot-starter-data-redis 2.1.6 redisson版本:redisson-spring-boot-starter 3.11.5 二、场景 Boolean res redisTemplate.opsForValue().setIfAbsent("key","value");以上代码同一时间多次执行…...
Python调用Jumpserver的Api接口增删改查
引言 Jumpserver是一款强大的堡垒机系统,可以有效管理和控制企业内部服务器的访问权限,提高网络安全性。本文将介绍如何使用Python编程语言,结合Jumpserver提供的API接口,实现对跳板机的管理和操作。 1、什么是Jumpserver&#…...
后端入门教程:从零开始学习后端开发
1. 编程基础 首先,作为一名后端开发者,你需要掌握至少一门编程语言。Python是一个很好的选择,因为它易于学习且功能强大。让我们从一个简单的示例开始,在控制台输出 "Hello, World!"。 2. 学习Web基础 了解Web开发基…...
无涯教程-JavaScript - DB函数
描述 DB函数使用固定余额递减法返回指定期间内资产的折旧。 语法 DB (cost, salvage, life, period, [month])争论 Argument描述Required/OptionalCostThe initial cost of the asset.RequiredSalvageThe value at the end of the depreciation (sometimes called the salv…...
2023年财务顾问行业研究报告
第一章 行业概况 1.1 定义及分类 财务顾问(Financial Advisor,FA)也被称为融资顾问,主要为创业公司提供投资和融资的专业服务。他们在创业者和投资者之间扮演着至关重要的中介角色,为双方搭建桥梁,确保投…...
2023SICTF ROUND2 baby_heap
附件:baby_heap libc版本:glibc2.23 思路一:通过house of orange泄露libc地址,然后通过unsorted bin attack将main_arena88地址写入到chunk_ptr(也就是申请出来的堆数组)中,这时候unsorted bi…...
buuctf crypto 【密码学的心声】解题记录
1.打开可以看到一个曲谱 2.看到曲谱中的提示埃塞克码可以想到ascii码,没有八可以联想到八进制,而八进制又对应着三位的二进制,然后写个脚本就好了 oct [111,114,157,166,145,123,145,143,165,162,151,164,171,126,145,162,171,115,165,143,…...
论文阅读 (100):Simple Black-box Adversarial Attacks (2019ICML)
文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 背景2.1 目标与非目标攻击2.2 最小化损失2.3 白盒威胁模型2.4 黑盒威胁模型 3 简单黑盒攻击3.1 算法3.2 Cartesian基3.3 离散余弦基3.4 一般基3.5 学习率 ϵ \epsilon ϵ3.6 预算 1 概述 1.1 要点 题目:简单黑盒对抗攻…...
41 个下载免费 3D 模型的最佳网站
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 1. Pikbest Pikbest是一个设计资源平台,提供超过3万件创意艺术品。您可以在Pikbest上找到设计模板,演示幻灯片,视频和音乐等。您可以找到不同的3D模型,例如婚礼装饰&…...
SpringMVC之JSR303和拦截器
认识JSR303 JSR303是一项Java标准规范,也叫做Bean Validation规范,提供了一种JavaBean数据验证的规范方式。在SpringMVC中,可以通过引入JSR303相关的依赖,来实现数据的校验。 在使用JSR303进行校验时,需要在需要校验的…...
通过rabbitmq生成延时消息,并生成rabbitmq镜像
通过rabbitmq生成延时消息队列,并生成rabbitmq镜像 整体描述1. 使用场景2. 目前问题3. 前期准备 具体步骤1. 拉取镜像2. 运行镜像3. 安装插件4. 代码支持4.1 config文件4.2 消费监听4.2 消息生产 5. 功能测试 镜像操作1. 镜像制作2. 镜像导入 总结 整体描述 1. 使用…...
结构型模式-外观模式
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系…...
vue三个点…运算符时报错 Syntax Error: Unexpected token
出现以下问题报错: 解决: 在项目根目录新建一个名为.babelrc的文件 {"presets": ["stage-2"] }...
C# wpf 实现桌面放大镜
文章目录 前言一、如何实现?1、制作无边框窗口2、Viewbox放大3、截屏显示(1)、截屏(2)、转BitmapSource(3)、显示 4、定时截屏 二、完整代码三、效果预览总结 前言 做桌面截屏功能时需要放大镜…...
Mybatis中的#{}和${}的区别
#{}和${}他们两都是替换参数的作用,但也还是有很大区别的。 目录 一、${} 二、#{} 三、注意点 一、${} 它是直接替换过来,不添加其它的什么。 比如下面的sql语句 select *from user where id${id} 如果id1,那么他替换过来就还是1ÿ…...
选择(使用)数据库
MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: use 数据库名称;大家应该知道,在对数据库进行操作的时候,要制定数据库的操作对象,也就是说操作哪一个数据库 案列:选择testing数据库 …...
GFS分布式文件系统
1、GlusterFS简介 GlusterFS(GFS)是一个开源的分布式文件系统 由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。MFS 传统的分布式文件系统大多通过元服务器来存储元数据,元数据…...
虚函数、纯虚函数、多态
一.虚函数 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。 …...
QGIS学习3 - 安装与管理插件
QGIS安装与管理插件主要是使用了菜单栏安装与管理插件这个菜单。 1、通过压缩文件等添加非官方插件 通过压缩文件添加有可能会提示存在安全问题等,直接点是即可。 之后点击install plugins即可完成。安装后导入插件 但是load失败了应该是安装没有成功。只能通过u…...
LeetCode377. 组合总和 Ⅳ
377. 组合总和 Ⅳ 文章目录 [377. 组合总和 Ⅳ](https://leetcode.cn/problems/combination-sum-iv/)一、题目二、题解方法一:完全背包一维数组动态规划思路代码分析 方法二:动态规划二维数组 一、题目 给你一个由 不同 整数组成的数组 nums ࿰…...
QT将数据写入文件,日志记录
项目场景: 在QT应用中,有时候需要将错误信息记录在log文件里面,或者需要将数据输出到文件中进行比对查看使用。 创建log文件,如果文件存在则不创建 QDir dir(QCoreApplication::applicationDirPath()"/recv_data");if(…...
vue2与vue3的使用区别与组件通信
1. 脚手架创建项目的区别: vue2: vue init webpack “项目名称”vue3: vue create “项目名称” 或者vue3一般与vite结合使用: npm create vitelatest yarn create vite2. template中结构 vue2: template下只有一个元素节点 <template><div><div…...
亚信科技与中国信通院达成全方位、跨领域战略合作
9月11日,亚信科技(中国)有限公司「简称:亚信科技」与中国信息通信研究院「简称:中国信通院」在京达成战略合作,双方将在关键技术研发、产业链协同等方面展开全方位、跨领域、跨行业深度合作,共促…...
华为Linux系统开发工程师面试
在Linux系统开发工程师的面试中,你可能会遇到以下一些问题: 在同一个网站中,当客户访问的时候,会出现有的页面访问的速度快而有的慢,系统和服务完全正常、网络带宽正常,你如何诊断这个问题?你以…...
智能在线设计/百度排名优化咨询电话
我:你看那本《三杯茶》了没有? 老婆:看了。 我:怎么样? 老婆:挺好的,讲人性的。 我:啊,你看懂了,我看了一点咋没看懂。 老婆:那当然了,…...
做网站一定要域名嘛/南京百度网站推广
1.首先定义一个接口Pageable 继承ResultSet这个类 并在接口中定义一些自己的方法,具体方法如下: package com.page; import java.sql.ResultSet; public interface Pageable extends ResultSet { /**返回总页数 */ int getPageCount(); /**返回当前页的记录条数 */ int getPa…...
网站建设发展的前景/抖音seo搜索优化
其实这东西本打算用原生的javascript来写,但是原生的javascript取class与监听滚动条的滚动过于麻烦,因此上了jQuery,没关系,反正兼容IE6就行。 将实现如下的效果: 也就是在网页中有点常见的滚动监听。相应的标题&…...
服装网站公司网站/兰州网络推广优化服务
在编辑 MD 的格式的时候出现了下面的问题。 文字和图片排版的时候出现了偏差。 问题和解决 这是因为文字和图片排版的时候没有空行。 在 MD 格式进行排版的时候文字和图片虽然在 MD 文件内已经空行了,但是在实际情况下,MD 将会将图片插入到文字的后面…...
服务佳的小企业网站建设/东莞seo外包
Spring Framework Documentation 5.3.10 Core Technologies 下载此文档pdf版 返回文档下载页面 Spring框架文档 - 核心技术部分 中英双语版 第二部分 内容目录 2. Resources (资源) 407 2.1. Introduction(介绍) 407 2.2. The Resource Interface(…...
做的网站怎么放视频/广告投放价目表
鉴权:及判断用户是否有访问接口的权利 Spring security提供了两种配置鉴权方式 1 在配置文件中配置 在SpringSecurityConfig中的 protected void configure(HttpSecurity http)方法中添加 sys:user就是菜单表中的code字段 Overrideprotected void configure(H…...