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

算法拾遗二十七之窗口最大值或最小值的更新结构

算法拾遗二十七之窗口最大值或最小值的更新结构

      • 滑动窗口
      • 题目一
      • 题目二
      • 题目三
      • 题目四

滑动窗口

第一种:R++,R右动,数会从右侧进窗口
第二种:L++,L右动,数从左侧出窗口

题目一

在这里插入图片描述
arr是N,窗口大小为W,会返回N-W+1个数

	// 暴力的对数器方法public static int[] right(int[] arr, int w) {if (arr == null || w < 1 || arr.length < w) {return null;}int N = arr.length;int[] res = new int[N - w + 1];int index = 0;//第一个窗口0-(w-1)int L = 0;int R = w - 1;while (R < N) {int max = arr[L];for (int i = L + 1; i <= R; i++) {max = Math.max(max, arr[i]);}res[index++] = max;L++;R++;}return res;}
	public static int[] getMaxWindow(int[] arr, int w) {if (arr == null || w < 1 || arr.length < w) {return null;}// qmax 双端队列就是窗口最大值的更新结构// 里面放下标方便更新LinkedList<Integer> qmax = new LinkedList<Integer>();//N-w+1int[] res = new int[arr.length - w + 1];int index = 0;//R表示窗口的右边界for (int R = 0; R < arr.length; R++) {//双端队列上最尾巴上的元素是不是小于当前的值的,如果小于等于则从尾巴弹出while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[R]) {qmax.pollLast();}qmax.addLast(R);//窗口的过期数的下标if (qmax.peekFirst() == R - w) {qmax.pollFirst();}//形成窗口的时候,表示需要收集答案,每一步都收集一个答案if (R >= w - 1) {res[index++] = arr[qmax.peekFirst()];}}return res;}

题目二

在这里插入图片描述
思路:
如果L-R已经达标了,那么L-R内部的所有子数组都是达标的,因为L-R范围内部的子数组max在变小,min在变大。
如果L-R范围不达标,那么L往左扩大范围和R往右边扩大范围都不达标。

准备一个窗口内最大值的更新结构,同样准备窗口内最小值的更新结构。【同时使用两个结构维持窗口内的最大和最小】
步骤:
1、L不动,R如果满足【L-R范围的最大值和最小值的差值如果都满足小于等于num】则R一直往右边扩
,直到不满足条件为止。(注意此时是L在0为止,算出从零开始的子数组有多少个累加进结果)
2、L向右移动一位,看看R能不能往右扩,再算从L+1位置到能构成条件的子数组有多少个,再累加进结果。

	// 暴力的对数器方法public static int right(int[] arr, int sum) {if (arr == null || arr.length == 0 || sum < 0) {return 0;}int N = arr.length;int count = 0;for (int L = 0; L < N; L++) {for (int R = L; R < N; R++) {int max = arr[L];int min = arr[L];for (int i = L + 1; i <= R; i++) {max = Math.max(max, arr[i]);min = Math.min(min, arr[i]);}if (max - min <= sum) {count++;}}}return count;}public static int num(int[] arr, int sum) {if (arr == null || arr.length == 0 || sum < 0) {return 0;}int N = arr.length;int count = 0;LinkedList<Integer> maxWindow = new LinkedList<>();LinkedList<Integer> minWindow = new LinkedList<>();int R = 0;for (int L = 0; L < N; L++) {//依次尝试窗口为0开始,1开始。。。。while (R < N) {//R扩到初次不达标的时候停while (!maxWindow.isEmpty() && arr[maxWindow.peekLast()] <= arr[R]) {//维护从大到小列表maxWindow.pollLast();}maxWindow.addLast(R);while (!minWindow.isEmpty() && arr[minWindow.peekLast()] >= arr[R]) {//维护从小到大列表minWindow.pollLast();}minWindow.addLast(R);//最大值减去最小值大于sum则初次不达标了停止if (arr[maxWindow.peekFirst()] - arr[minWindow.peekFirst()] > sum) {break;} else {R++;}}//加结果count += R - L;//如果L即将过期则弹出窗口对应值if (maxWindow.peekFirst() == L) {maxWindow.pollFirst();}if (minWindow.peekFirst() == L) {minWindow.pollFirst();}}return count;}// for testpublic static int[] generateRandomArray(int maxLen, int maxValue) {int len = (int) (Math.random() * (maxLen + 1));int[] arr = new int[len];for (int i = 0; i < len; i++) {arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * (maxValue + 1));}return arr;}// for testpublic static void printArray(int[] arr) {if (arr != null) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}}public static void main(String[] args) {int maxLen = 100;int maxValue = 200;int testTime = 100000;System.out.println("测试开始");for (int i = 0; i < testTime; i++) {int[] arr = generateRandomArray(maxLen, maxValue);int sum = (int) (Math.random() * (maxValue + 1));int ans1 = right(arr, sum);int ans2 = num(arr, sum);if (ans1 != ans2) {System.out.println("Oops!");printArray(arr);System.out.println(sum);System.out.println(ans1);System.out.println(ans2);break;}}System.out.println("测试结束");}

题目三

在这里插入图片描述
给定两个数组一个是gas数组,一个是cost数组,
0号加油站有1单位的油,但是跑到加油站2需要耗费两单位的油,从哪个加油站开始能转完一圈?
在这里插入图片描述
如上图,只能通过从C出发才能跑完一圈
思路:
加工出一个arr数组,就是gas-cost数组,做一个简化
在这里插入图片描述
再看如下例子
在这里插入图片描述
暴力解:搞定循环数组的遍历,从0位置出发找是否有解,从1位置出发找是否有解依次找下去
方法二:
1、先算累加和:
在这里插入图片描述
这样写的目的:从零出发一直累加到五之前,可以判断从0位置出发不是良好出发点,再看从1位置出发依次累加
在这里插入图片描述
里面包含负数可以知道它不是一个良好出发点,如上图这个数组就是算从零位置开始计算的累加和得到的那个数组减去-2得到的数组。
做一个两倍长度的数组就是想让它所有原始数组中出发的那个位置,在长数组中能把它原始的累加和给加工出来
则每次计算后续的出发点的数组内容时,则减去前一个就能得到了
在这里插入图片描述
搞一个窗口,这个窗口就是原始数组的长度,窗口的最小值(最薄弱点)是-5减去出发位置前面一个数,从而还原出原始数组累加和最薄弱点,还原出的结果还是小于0则不是良好出发点,还原出的结果不小于0则是良好出发点

如0位置出发薄弱点为-5,还原出原始累加和为-5-0还是小于0不是良好出发点。

这道题,在这里插入图片描述
要想到窗口往最大值和最小值上面靠,进而想到累加和最薄弱的点

// 测试链接:https://leetcode.com/problems/gas-station
public class GasStation {// 这个方法的时间复杂度O(N),额外空间复杂度O(N)public static int canCompleteCircuit(int[] gas, int[] cost) {boolean[] good = goodArray(gas, cost);for (int i = 0; i < gas.length; i++) {if (good[i]) {return i;}}return -1;}public static boolean[] goodArray(int[] g, int[] c) {int N = g.length;int M = N << 1;int[] arr = new int[M];for (int i = 0; i < N; i++) {arr[i] = g[i] - c[i];arr[i + N] = g[i] - c[i];}for (int i = 1; i < M; i++) {arr[i] += arr[i - 1];}LinkedList<Integer> w = new LinkedList<>();for (int i = 0; i < N; i++) {while (!w.isEmpty() && arr[w.peekLast()] >= arr[i]) {w.pollLast();}w.addLast(i);}boolean[] ans = new boolean[N];for (int offset = 0, i = 0, j = N; j < M; offset = arr[i++], j++) {if (arr[w.peekFirst()] - offset >= 0) {ans[i] = true;}if (w.peekFirst() == i) {w.pollFirst();}while (!w.isEmpty() && arr[w.peekLast()] >= arr[j]) {w.pollLast();}w.addLast(j);}return ans;}}

题目四

在这里插入图片描述

public class Code04_MinCoinsOnePaper {public static int minCoins(int[] arr, int aim) {return process(arr, 0, aim);}public static int process(int[] arr, int index, int rest) {if (rest < 0) {return Integer.MAX_VALUE;}if (index == arr.length) {return rest == 0 ? 0 : Integer.MAX_VALUE;} else {int p1 = process(arr, index + 1, rest);int p2 = process(arr, index + 1, rest - arr[index]);if (p2 != Integer.MAX_VALUE) {p2++;}return Math.min(p1, p2);}}// dp1时间复杂度为:O(arr长度 * aim)public static int dp1(int[] arr, int aim) {if (aim == 0) {return 0;}int N = arr.length;int[][] dp = new int[N + 1][aim + 1];dp[N][0] = 0;for (int j = 1; j <= aim; j++) {dp[N][j] = Integer.MAX_VALUE;}for (int index = N - 1; index >= 0; index--) {for (int rest = 0; rest <= aim; rest++) {int p1 = dp[index + 1][rest];int p2 = rest - arr[index] >= 0 ? dp[index + 1][rest - arr[index]] : Integer.MAX_VALUE;if (p2 != Integer.MAX_VALUE) {p2++;}dp[index][rest] = Math.min(p1, p2);}}return dp[0][aim];}public static class Info {public int[] coins;public int[] zhangs;public Info(int[] c, int[] z) {coins = c;zhangs = z;}}public static Info getInfo(int[] arr) {HashMap<Integer, Integer> counts = new HashMap<>();for (int value : arr) {if (!counts.containsKey(value)) {counts.put(value, 1);} else {counts.put(value, counts.get(value) + 1);}}int N = counts.size();int[] coins = new int[N];int[] zhangs = new int[N];int index = 0;for (Entry<Integer, Integer> entry : counts.entrySet()) {coins[index] = entry.getKey();zhangs[index++] = entry.getValue();}return new Info(coins, zhangs);}// dp2时间复杂度为:O(arr长度) + O(货币种数 * aim * 每种货币的平均张数)public static int dp2(int[] arr, int aim) {if (aim == 0) {return 0;}// 得到info时间复杂度O(arr长度)Info info = getInfo(arr);int[] coins = info.coins;int[] zhangs = info.zhangs;int N = coins.length;int[][] dp = new int[N + 1][aim + 1];dp[N][0] = 0;for (int j = 1; j <= aim; j++) {dp[N][j] = Integer.MAX_VALUE;}// 这三层for循环,时间复杂度为O(货币种数 * aim * 每种货币的平均张数)for (int index = N - 1; index >= 0; index--) {for (int rest = 0; rest <= aim; rest++) {dp[index][rest] = dp[index + 1][rest];for (int zhang = 1; zhang * coins[index] <= aim && zhang <= zhangs[index]; zhang++) {if (rest - zhang * coins[index] >= 0&& dp[index + 1][rest - zhang * coins[index]] != Integer.MAX_VALUE) {dp[index][rest] = Math.min(dp[index][rest], zhang + dp[index + 1][rest - zhang * coins[index]]);}}}}return dp[0][aim];}// dp3时间复杂度为:O(arr长度) + O(货币种数 * aim)// 优化需要用到窗口内最小值的更新结构public static int dp3(int[] arr, int aim) {if (aim == 0) {return 0;}// 得到info时间复杂度O(arr长度)Info info = getInfo(arr);int[] c = info.coins;int[] z = info.zhangs;int N = c.length;int[][] dp = new int[N + 1][aim + 1];dp[N][0] = 0;for (int j = 1; j <= aim; j++) {dp[N][j] = Integer.MAX_VALUE;}// 虽然是嵌套了很多循环,但是时间复杂度为O(货币种数 * aim)// 因为用了窗口内最小值的更新结构for (int i = N - 1; i >= 0; i--) {for (int mod = 0; mod < Math.min(aim + 1, c[i]); mod++) {// 当前面值 X// mod  mod + x   mod + 2*x   mod + 3 * xLinkedList<Integer> w = new LinkedList<>();w.add(mod);dp[i][mod] = dp[i + 1][mod];for (int r = mod + c[i]; r <= aim; r += c[i]) {while (!w.isEmpty() && (dp[i + 1][w.peekLast()] == Integer.MAX_VALUE|| dp[i + 1][w.peekLast()] + compensate(w.peekLast(), r, c[i]) >= dp[i + 1][r])) {w.pollLast();}w.addLast(r);int overdue = r - c[i] * (z[i] + 1);if (w.peekFirst() == overdue) {w.pollFirst();}dp[i][r] = dp[i + 1][w.peekFirst()] + compensate(w.peekFirst(), r, c[i]);}}}return dp[0][aim];}public static int compensate(int pre, int cur, int coin) {return (cur - pre) / coin;}// 为了测试public static int[] randomArray(int N, int maxValue) {int[] arr = new int[N];for (int i = 0; i < N; i++) {arr[i] = (int) (Math.random() * maxValue) + 1;}return arr;}// 为了测试public static void printArray(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}// 为了测试public static void main(String[] args) {int maxLen = 20;int maxValue = 30;int testTime = 300000;System.out.println("功能测试开始");for (int i = 0; i < testTime; i++) {int N = (int) (Math.random() * maxLen);int[] arr = randomArray(N, maxValue);int aim = (int) (Math.random() * maxValue);int ans1 = minCoins(arr, aim);int ans2 = dp1(arr, aim);int ans3 = dp2(arr, aim);int ans4 = dp3(arr, aim);if (ans1 != ans2 || ans3 != ans4 || ans1 != ans3) {System.out.println("Oops!");printArray(arr);System.out.println(aim);System.out.println(ans1);System.out.println(ans2);System.out.println(ans3);System.out.println(ans4);break;}}System.out.println("功能测试结束");System.out.println("==========");int aim = 0;int[] arr = null;long start;long end;int ans2;int ans3;System.out.println("性能测试开始");maxLen = 30000;maxValue = 20;aim = 60000;arr = randomArray(maxLen, maxValue);start = System.currentTimeMillis();ans2 = dp2(arr, aim);end = System.currentTimeMillis();System.out.println("dp2答案 : " + ans2 + ", dp2运行时间 : " + (end - start) + " ms");start = System.currentTimeMillis();ans3 = dp3(arr, aim);end = System.currentTimeMillis();System.out.println("dp3答案 : " + ans3 + ", dp3运行时间 : " + (end - start) + " ms");System.out.println("性能测试结束");System.out.println("===========");System.out.println("货币大量重复出现情况下,");System.out.println("大数据量测试dp3开始");maxLen = 20000000;aim = 10000;maxValue = 10000;arr = randomArray(maxLen, maxValue);start = System.currentTimeMillis();ans3 = dp3(arr, aim);end = System.currentTimeMillis();System.out.println("dp3运行时间 : " + (end - start) + " ms");System.out.println("大数据量测试dp3结束");System.out.println("===========");System.out.println("当货币很少出现重复,dp2比dp3有常数时间优势");System.out.println("当货币大量出现重复,dp3时间复杂度明显优于dp2");System.out.println("dp3的优化用到了窗口内最小值的更新结构");}}

相关文章:

算法拾遗二十七之窗口最大值或最小值的更新结构

算法拾遗二十七之窗口最大值或最小值的更新结构滑动窗口题目一题目二题目三题目四滑动窗口 第一种&#xff1a;R&#xff0c;R右动&#xff0c;数会从右侧进窗口 第二种&#xff1a;L&#xff0c;L右动&#xff0c;数从左侧出窗口 题目一 arr是N&#xff0c;窗口大小为W&…...

【带你搞定第二、三、四层交换机】

​ 01 第二层交换机 OSI参考模型的第二层叫做数据链路层&#xff0c;第二层交换机通过链路层中的MAC地址实现不同端口间的数据交换。 第二层交换机主要功能&#xff0c;就包括物理编址、错误校验、帧序列以及数据流控制。 因为这是最基本的交换技术产品&#xff0c;目前桌面…...

C++基础了解-22-C++ 重载运算符和重载函数

C 重载运算符和重载函数 一、C 重载运算符和重载函数 C 允许在同一作用域中的某个函数和运算符指定多个定义&#xff0c;分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明&#xff0c;但是它们的参数列表和定义…...

BatchNormalization

目录 Covariate Shift Internal Covariate Shift BatchNormalization &#xff31;1:BN的原理 Q2:BN的作用 Q3:BN的缺陷 Q4&#xff1a;BN的均值、方差的计算维度 Q5&#xff1a;BN在训练和测试时有什么区别 Q6&#xff1a;BN的代码实现 Covariate Shift 机器学习中&a…...

vue 中安装插件实现 rem 适配

vue 中实现 rem 适配vue 项目实现页面自适应&#xff0c;可以安装插件实现。 postcss-pxtorem 是 PostCSS 的插件&#xff0c;用于将像素单元生成 rem 单位。 autoprefixer 浏览器前缀处理插件。 amfe-flexible 可伸缩布局方案替代了原先的 lib-flexible 选用了当前众多浏览…...

Hadoop学习

1.分布式与集群 hosts文件&#xff1a; 域名映射文件 2.Linux常用命令 ls -a&#xff1a;查看当前目录下所有文件mkdir -p&#xff1a;如果没有对应的父文件夹&#xff0c;会自动创建rm -rf&#xff1a;-f&#xff1a;强制删除 -r&#xff1a;递归删除cp -r&#xff1a;复制文…...

Golang反射源码分析

在go的源码包及一些开源组件中&#xff0c;经常可以看到reflect反射包的使用&#xff0c;本文就与大家一起探讨go反射机制的原理、学习其实现源码 首先&#xff0c;了解一下反射的定义&#xff1a; 反射是指计算机程序能够在运行时&#xff0c;能够描述其自身状态或行为、调整…...

Qt之悬浮球菜单

一、概述 最近想做一个炫酷的悬浮式菜单&#xff0c;考虑到菜单展开和美观&#xff0c;所以考虑学习下Qt的动画系统和状态机内容&#xff0c;打开QtCreator的示例教程浏览了下&#xff0c;大致发现教程中2D Painting程序和Animated Tiles程序有所帮助&#xff0c;如下图所示&a…...

易优cms attribute 栏目属性列表

attribute 栏目属性列表 attribute 栏目属性列表 [基础用法] 标签&#xff1a;attribute 描述&#xff1a;获取栏目的属性列表&#xff0c;或者单独获取某个属性值。 用法&#xff1a; {eyou:attribute typeauto} {$attr.name}&#xff1a;{$attr.value} {/eyou:attri…...

表格中的table-layout属性讲解

表格中的table-layout属性讲解 定义和用法 tableLayout 属性用来显示表格单元格、行、列的算法规则。 table-layout有三个属性值&#xff1a;auto、fixed、inherit。 fixed&#xff1a;固定表格布局 固定表格布局与自动表格布局相比&#xff0c;允许浏览器更快地对表格进行布…...

【MFA】windows环境下,使用Montreal-Forced-Aligner训练并对齐音频

文章目录一、安装MFA1.安装anaconda2.创建并进入虚拟环境3.安装pyTorch二、训练新的声学模型1.确保数据集的格式正确2.训练声音模型-导出模型和对齐文件3.报错处理1.遇到类似&#xff1a; Command ‘[‘createdb’,–host‘ ’, ‘Librispeech’]’ returned non-zero exit sta…...

C语言实验小项目实例源码大全订票信息管理系统贪吃蛇图书商品管理网络通信等

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;c项目 获取完整源码源文件视频讲解环境资源包文档说明等 包括火车订票系统、学生个人消费管理系统、超级万年历、学生信息管理系统、网络通信编程、商品管理系统、通讯录管理系统、企业员工管理系统、贪吃蛇游戏、图书管理…...

电脑图片损坏是怎么回事

电脑图片损坏是怎么回事&#xff1f;对于经常使用电脑的我们&#xff0c;总是会下载各种各样的图片&#xff0c;用于平时的使用中。但难免会遇到莫名其妙就损坏的图片文件&#xff0c;一旦发生这种情况&#xff0c;要如何才能修复损坏的图片呢?下面小编为大家带来常用的修复方…...

【论文研读】无人机飞行模拟仿真平台设计

无人机飞行模拟仿真平台设计 摘要&#xff1a; 为提高飞行控制算法的研发效率,降低研发成本,基于数字孪生技术设计一个无人机硬件在环飞行模拟仿真平台。从几何、物理和行为3个方面研究无人机数字模型构建方法,将物理实体以数字化方式呈现。设计一种多元融合场景建模法,依据属…...

【算法题】2379. 得到 K 个黑块的最少涂色次数

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个长度为 n 下标从 0 开始的…...

DJ1-3 计算机网络和因特网

目录 一、物理介质 1. 双绞线 2. 同轴电缆 3. 光纤线缆 4. 无线电磁波 二、端系统上的 Internet 服务 1. 面向连接的服务 TCP&#xff08;Transmission Control Protocol&#xff09; 2. 无连接的服务 UDP&#xff08;User Datagram Protocol&#xff09; TCP 和 UD…...

Git学习笔记(六)-标签管理

发布一个版本时&#xff0c;我们通常先在版本库中打一个标签&#xff08;tag&#xff09;&#xff0c;这样&#xff0c;就唯一确定了打标签时刻的版本。将来无论什么时候&#xff0c;取某个标签的版本&#xff0c;就是把那个打标签的时刻的历史版本取出来。所以&#xff0c;标签…...

Semaphore 源码解读

一、Semaphore Semaphore 通过设置一个固定数值的信号量&#xff0c;并发时线程通过 acquire() 获取一个信号量&#xff0c;如果能成功获得则可以继续执行&#xff0c;否则将阻塞等待&#xff0c;当某个线程使用 release() 释放一个信号量时&#xff0c;被阻塞的线程则可以被唤…...

RZ/G2L工业核心板U盘读写速率测试

1. 测试对象HD-G2L-IOT基于HD-G2L-CORE工业级核心板设计&#xff0c;双路千兆网口、双路CAN-bus、2路RS-232、2路RS-485、DSI、LCD、4G/5G、WiFi、CSI摄像头接口等&#xff0c;接口丰富&#xff0c;适用于工业现场应用需求&#xff0c;亦方便用户评估核心板及CPU的性能。HD-G2L…...

《SQL与数据库基础》18. MySQL管理

SQL - MySQL管理MySQL管理系统数据库常用工具mysqlmysqladminmysqlbinlogmysqlshowmysqldumpmysqlimportsource本文以 MySQL 为例 MySQL管理 系统数据库 Mysql数据库安装完成后&#xff0c;自带了以下四个数据库&#xff0c;具体作用如下&#xff1a; 数据库含义mysql存储My…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...