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

算法闭关修炼百题计划(一)

多看优秀的代码一定没有错,此篇博客属于个人学习记录

  • 1.两数之和
  • 2.前k个高频元素
  • 3.只出现一次的数字
  • 4.数组的度
  • 5.最佳观光组合
  • 6.整数反转
  • 7.缺失的第一个正数
  • 8.字符串中最多数目的子序列
  • 9.k个一组翻转链表
  • 10.反转链表II
  • 11. 公司命名
  • 12.合并区间
  • 13.快速排序
  • 14.数字中的第k个最大元素
  • 15.归并排序
  • 16.岛屿数量
  • 17.每种字符至少取k个
  • 18.螺旋矩阵II
  • 19.旋转图像
  • 20.删除数组中重复的元素II

1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> heap;for(int i = 0; i < nums.size(); i ++){if(heap.find(target - nums[i]) != heap.end()) return {heap[target - nums[i]], i};heap[nums[i]] = i;}return {};}
};

2.前k个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int, int> valToFreq;vector<int> result;for(auto num : nums){valToFreq[num] ++;}vector<pair<int,int>> vec(valToFreq.begin(), valToFreq.end());sort(vec.begin(),vec.end(),[](pair<int,int>& a, pair<int,int>& b){return a.second > b.second;});for(auto pair:vec){if(k > 0){result.push_back(pair.first);   }k--;}return result;}
};

3.只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

不能用sort也不能新开空间!
小tips:

一个数和它本身做异或运算结果为 0,即 a ^ a = 0;
一个数和 0 做异或运算的结果为它本身,即 a ^ 0 = a。
对于这道题目,我们只要把所有数字进行异或,成对儿的数字就会变成 0,落单的数字和 0 做异或还是它本身,所以最后异或的结果就是只出现一次的元素。
class Solution {
public:int singleNumber(std::vector<int>& nums) {int res = 0;for (int n : nums) {res ^= n;}return res;}
};

4.数组的度

给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。

你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。

class Solution {
public:const int N = 50010;int findShortestSubArray(vector<int>& nums) {int n = nums.size(), maxP = 0, ans = 0x3f3f3f3f;//统计频率unordered_map<int, int> umap;//统计每个元素出现的最早和最晚位置vector<int> first(N, -1), last(N, -1);for(int i = 0; i < nums.size(); i ++){umap[nums[i]]++;maxP = max(maxP, umap[nums[i]]);if(first[nums[i]] == -1) first[nums[i]] = i;last[nums[i]] = i;}for(auto t : nums){if(umap[t] == maxP) ans = min(ans, last[t] - first[t] + 1);}return ans;}
};

5.最佳观光组合

给你一个正整数数组 values,其中 values[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的 距离 为 j - i。
一对景点(i < j)组成的观光组合的得分为 values[i] + values[j] + i - j ,也就是景点的评分之和 减去 它们两者之间的距离。
返回一对观光景点能取得的最高分。

class Solution {
public:int maxScoreSightseeingPair(vector<int>& values) {//求value[i] + value[j] + i - j的max//相当于求value[i] + i, 和value[j] - j的最大值, i < j//所以只需要遍历一次int maxScore = INT_MIN, left = values[0];for(int i = 1; i < values.size(); i ++){maxScore = max(maxScore, values[i] - i + left);left = max(left, values[i] + i);}return maxScore;}
};

6.整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

class Solution {
public:int reverse(int x) {long long res = 0;  // 使用 long long 避免溢出int sign = (x < 0) ? -1 : 1;  // 根据 x 的符号确定结果的符号x = abs(x);  // 只处理正数,避免负号干扰while (x != 0) {res = res * 10 + x % 10;  // 反转数字x /= 10;  // 去除最低位if (res > INT_MAX) return 0;  // 检查溢出}return sign * res;  // 应用符号并返回结果}
};

7.缺失的第一个正数

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

这个最小的正整数一定在[1,nums.size() + 1]之间,为什么。想一想

class Solution {
public:int firstMissingPositive(vector<int>& nums) {unordered_map<int, int> umap;for(int i = 0; i < nums.size(); i++){umap[nums[i]]++;}for(int i = 1; i <= nums.size(); i ++){if(umap[i] == 0) return i;}return nums.size()+1;}
};

8.字符串中最多数目的子序列

给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern ,两者都只包含小写英文字母。

你可以在 text 中任意位置插入 一个 字符,这个插入的字符必须是 pattern[0] 或者 pattern[1] 。注意,这个字符可以插入在 text 开头或者结尾的位置。

请你返回插入一个字符后,text 中最多包含多少个等于 pattern 的 子序列 。

子序列 指的是将一个字符串删除若干个字符后(也可以不删除),剩余字符保持原本顺序得到的字符串。

比如:
输入:text = “abdcdbc”, pattern = “ac”
输出:4

思路:
首先考虑不加的情况,怎么计算子序列?
使用两个变量 cnt0 和 cnt1 分别记录 pattern[0] 和 pattern[1] 出现了多少次,使用 ans 记录答案数量。

遍历字符串,如果当前字符和 pattern[1] 相同,那么ans += cnt0(这是因为之前的每个pattern[0]都可以和当前字符组成pattern,并且cnt1 += 1;

如果当前字符和pattern[0]相同,那么cnt0 += 1。

现在再考虑加上字符,会有什么变化?
如果要添加pattern[0]到字符串中,那么肯定要将pattern[0]添加到字符串开头,这样后面每个pattern[1]都可以和开头新增的这个pattern[0]组成pattern,答案数量增加cnt1(有多少个pattern[1]就能多组成多少个pattern);

如果要添加pattern[1]到字符串中,那么肯定要添加到字符串尾,这样答案数量就会增加cnt0。

也就是说,往字符串中添加字符,最多可以令答案增加max(cnt0,cnt1)

typedef long long ll;
class Solution{
public:ll maximumSubsequenceCount(string text, string pattern) {ll ans = 0;ll cnt0 = 0, cnt1 = 0;//for计算不加的情况,顺便记录cnt01值for(char c : text){if(c == pattern[1]){cnt1++;ans += cnt0;}if(c == pattern[0]){cnt0++;}}return ans + max(cnt0, cnt1);}
};

9.k个一组翻转链表

题目要求输入 head,reverseKGroup 函数能够把以 head 为头的这条链表进行翻转。

我们要充分利用这个递归函数的定义,把原问题分解成规模更小的子问题进行求解。
先翻转以head开头的k个元素,将第k+1个元素作为head递归调用 reverseKGroup 函数。

然后还需要将两个过程的结果连起来
在这里插入图片描述

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {if(head == nullptr) return nullptr;//区间[a,b)包含k个待翻转的元素ListNode* a = head;ListNode* b = head;for(int i = 0; i < k; i ++){if(b ==  nullptr) return head;b = b->next;}//翻转前k个ListNode* newHead = reverse(a, b);//翻转前后连起来a->next = reverseKGroup(b, k);return newHead;}//[a,b)ListNode* reverse(ListNode* a, ListNode* b){ListNode* pre, *cur, *tmp;pre = nullptr;cur = a;tmp = a;while(cur != b){tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}return pre;}
};

10.反转链表II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

假如left == 1,需要反转的部分从链表的第一个节点就开始,那么翻转后链表的头结点将发生变化,使用dummy可以特殊处理这种情况。

class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode* dummy = new ListNode(0);dummy->next = head;ListNode* p0 = dummy;for(int i = 1; i < left; i ++) p0 = p0->next;ListNode* pre = nullptr;ListNode* cur = p0->next;for(int i = 0; i < right - left + 1; i ++){ListNode* tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}p0->next->next = cur;p0->next = pre;return dummy->next;}
};

11. 公司命名

在这里插入图片描述
难得一批,但是看懂了

思路:
按照首字母来统计后半部分字符串的集合,如果2个集合之间的元素可以互换首字母,那么只要满足A集合中的没有在B集合出现过即可。

class Solution {
public:long long distinctNames(vector<string>& ideas) {// 使用数组存储每个首字母对应的尾部部分集合vector<unordered_set<string>> sets(26);// 将 ideas 按首字母分类存入对应的集合for (const string& idea : ideas) {sets[idea[0] - 'a'].insert(idea.substr(1));}long long ans = 0;// 双重循环比较不同首字母的集合for (int i = 0; i < 26; i++) {for (int j = 0; j < i; j++) {int m = 0;// m 统计两个集合中相同尾部部分的个数for (const string& s : sets[i]) {if (sets[j].count(s)) {m++;}}// 计算有效组合ans += (long long)(sets[i].size() - m) * (sets[j].size() - m);}}return ans * 2;}
};

12.合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

注意他的for是怎么遍历的

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {//按照start排序sort(intervals.begin(), intervals.end(),[](vector<int> a, vector<int> b){return a[0] < b[0];});vector<vector<int>> res;//把第一个元素push进去res.push_back(intervals[0]);for(int i = 1; i < intervals.size(); i ++){//区间重叠if(res.back()[1] >= intervals[i][0]){res.back()[1] = max(res.back()[1], intervals[i][1]);}//区间不重叠else{res.push_back(intervals[i]);}}return res;}
};

13.快速排序

快排就是分治,给一个基准值,左边都小于这个基准值,右边都大于这个基准值
分别排序左右,合并就是有序数组了
注意mid = nums[(l + r) / 2],而不是mid = (l + r) / 2,不要用索引直接用值

class Solution {
public:void quick_sort(vector<int>& nums, int l, int r){if(l >= r) return;int left = l - 1, right = r + 1, mid = nums[(l + r) / 2];while(left < right){do left ++; while(nums[left] < mid);do right--;while(nums[right] > mid);if(left < right) swap(nums[left], nums[right]);}quick_sort(nums, l, right);quick_sort(nums, right + 1, r);}vector<int> sortArray(vector<int>& nums) {quick_sort(nums, 0, nums.size() - 1);return nums;}
};

14.数字中的第k个最大元素

真的很想sort,但是这道题考频这么高,不可能让你调用库函数…

如果对原数组排序,再返回倒数第k个位置,这样复杂度是O(nlogn)
其实可以更快
在快排中,每次经过划分后,一定可以确定一个元素的最终位置,即x的最终位置是q,并且a[l…q - 1]中的每个元素小于等于a[q],且a[q]小于等于a[q + 1…r]中的每个元素,所以只要某次划分的q为倒数第k个下标的时候,我们就找到了答案,只需关注这点。

class Solution {
public:int quickselect(vector<int> &nums, int l, int r, int k) {if (l == r)return nums[k];int mid = nums[(l + r)/2], i = l - 1, j = r + 1;while (i < j) {do i++; while (nums[i] < mid);do j--; while (nums[j] > mid);if (i < j)swap(nums[i], nums[j]);}if (k <= j) return quickselect(nums, l, j, k);else return quickselect(nums, j + 1, r, k);}int findKthLargest(vector<int> &nums, int k) {int n = nums.size();return quickselect(nums, 0, n - 1, n - k);}
};

15.归并排序

如果说快排是前序,那么归并就是后序,一个是先计算再递归,一个是先递归再计算
两个都属于分治算法

void merge_sort(vector<int>& nums, int lo, int hi){if(lo >= hi) return;int mid = (lo + hi) >> 1;merge_sort(nums, lo, mid);merge_sort(nums, mid + 1, hi);vector<int> tmp(hi - lo + 1); // 创建一个新的 tmp 数组int k = 0;int i = lo, j = mid + 1;while(i <= mid && j <= hi){if(nums[i] > nums[j]){tmp[k++] = nums[j++];}else{tmp[k++] = nums[i++];}}while(i <= mid) tmp[k++] = nums[i++];while(j <= hi) tmp[k++] = nums[j++];for(int i = lo, j = 0; i <= hi && j < k; i ++, j ++){nums[i] = tmp[j];}
}

16.岛屿数量

class Solution {
private:int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y){for(int i = 0; i < 4; i ++){//4个方向的1全标记trueint nextx = x + dir[i][0];int nexty = y + dir[i][1];if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;if(!visited[nextx][nexty] && grid[nextx][nexty] == '1'){visited[nextx][nexty] = true;dfs(grid, visited, nextx, nexty);}}}
public:int numIslands(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited(n, vector<bool>(m, false));int res = 0;for(int i = 0; i < n; i ++){for(int j = 0; j < m; j ++){if(!visited[i][j] && grid[i][j] == '1'){res++;dfs(grid, visited, i, j);}}}return res;}
};

17.每种字符至少取k个

给你一个由字符 ‘a’、‘b’、‘c’ 组成的字符串 s 和一个非负整数 k 。每分钟,你可以选择取走 s 最左侧 还是 最右侧 的那个字符。

你必须取走每种字符 至少 k 个,返回需要的 最少 分钟数;如果无法取到,则返回 -1 。

两边不好想,用滑动窗口想中间
怎么看外面字符呢,用一个tar数组,初始化为-k,for遍历++,tar中存的就是比k多的数量
滑动窗口内的数字,和tar里面留的数字比较,滑动窗口的数字小于tar中的,说明两侧这个字母的数量>k,滑动窗口的数字大于tar中的,说明两侧这个字母小于k

什么时候缩小窗口:因为当窗口中某个字符的数量 超过 tar 时,就意味着在剩余的字符串中,该字符的数量将 少于 k,这不符合题目要求。tar[i] 表示的是在可以移除的字符中,每种字符最多能移除的数量(即总数量减去 k)。因此,在滑动窗口中,我们需要确保窗口中每种字符的数量 不超过 tar[i]。

class Solution {
public:int takeCharacters(string s, int k) {vector<int> tar(3, -k);  // 初始化目标数组为-kfor (char c : s) tar[c - 'a']++;  // 计数数组// 如果任意字符计数小于0,则无法形成有效子串if (tar[0] < 0 || tar[1] < 0 || tar[2] < 0) return -1;// 如果所有字符恰好达到k次,返回整个字符串长度if (tar[0] == 0 && tar[1] == 0 && tar[2] == 0) return s.length();int l = 0, r = 0, res = 0;vector<int> cnt(3, 0);  // 计数当前窗口中各字符的数量while (r < s.length()) {cnt[s[r++] - 'a']++;  // 扩展窗口右边界// 当窗口中任一字符数量超过tar时,收缩窗口左边界while (cnt[0] > tar[0] || cnt[1] > tar[1] || cnt[2] > tar[2]) {cnt[s[l++] - 'a']--;}// 更新最大子串长度res = max(res, r - l);}// 返回除去最短有效子串后的剩余长度return s.length() - res;}
};

18.螺旋矩阵II

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

四个方向循环的表达式 dirIdx = (dirIdx + 1) % 4; 是一种非常高效且常用的方式来实现这种循环控制:

  • dirIdx + 1:这部分是将当前的方向索引增加1,以便移动到下一个方向。
  • 取模运算符 % 用来实现循环效果。因为有四个方向,所以取模4。这意味着当 dirIdx 从3增加1变为4时,4 % 4 的结果是0,从而将方向索引重置为0(即向右方向),形成一个循环。
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {if (matrix.empty()) return {}; // 处理空矩阵的情况int n = matrix.size();int m = matrix[0].size();vector<int> res;vector<vector<int>> direction = {{0, 1},  // 向右移动{1, 0},  // 向下移动{0, -1}, // 向左移动{-1, 0}  // 向上移动};vector<vector<bool>> seen(n, vector<bool>(m, false));int i = 0, j = 0, dirIdx = 0; // dirIdx 用来控制方向for (int k = 0; k < m * n; k++) {res.push_back(matrix[i][j]);seen[i][j] = true;int nexti = i + direction[dirIdx][0];int nextj = j + direction[dirIdx][1];// 检查是否需要转向:下一步是否出界或已访问if (nexti >= 0 && nexti < n && nextj >= 0 && nextj < m && !seen[nexti][nextj]) {i = nexti;j = nextj;} else {// 调整方向dirIdx = (dirIdx + 1) % 4; // 四个方向循环i += direction[dirIdx][0];j += direction[dirIdx][1];}}return res;}
};

19.旋转图像

90度旋转
在这里插入图片描述
要求原地旋转,不另开数组

其实是个数学问题
先上下对称翻转,再主对角线翻转
在这里插入图片描述

class Solution {
public:void rotate(vector<vector<int>>& matrix) {int n = matrix.size() ;//首先进行上下翻转for( int i = 0 ; i < n/2 ; i ++ ){swap(matrix[ i ], matrix[ n - i - 1]) ; }//然后进行对角线翻转for( int i = 0 ; i < n ; i ++ ){for( int j = i ; j < n ;j ++ ){swap(matrix[i][j],matrix[j][i]) ;}}}
};

20.删除数组中重复的元素II

有重复的全删掉,一个也不留

需要dummy node
初始化cur指向dummy node
每次循环看下一个节点和下下节点的值是不是一样的,如果是一样的,就嵌套一个while,不一样,cur就移动

这里嵌套while的方法无敌,仔细学

class Solution {
public:ListNode* deleteDuplicates(ListNode* head) {ListNode* dummy = new ListNode(0);dummy->next = head;ListNode* cur = dummy;while(cur && cur->next && cur->next->next){//先把这个值存下来int num = cur->next->val;if(cur->next->next->val == num){//可能不止2个while(cur->next && cur->next->val == num){cur->next = cur->next->next;}}else cur = cur->next;}return dummy->next;}
};

相关文章:

算法闭关修炼百题计划(一)

多看优秀的代码一定没有错&#xff0c;此篇博客属于个人学习记录 1.两数之和2.前k个高频元素3.只出现一次的数字4.数组的度5.最佳观光组合6.整数反转7.缺失的第一个正数8.字符串中最多数目的子序列9.k个一组翻转链表10.反转链表II11. 公司命名12.合并区间13.快速排序14.数字中的…...

vue3实现打字机的效果,可以换行

之前看了很多文章,效果是实现了,就是没有自动换行的效果,参考了文章写了一个,先上个效果图,卡顿是因为模仿了卡顿的效果,还是很丝滑的 目录 效果图:代码如下 效果图: ![请添加图片描述](https://i-blog.csdnimg.cn/direct/d8ef33d83dd3441a87d6d033d9e7cafa.gif 代码如下 原…...

【如何学习操作系统】——学会学习的艺术

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f421;&#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼 &#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前…...

stm32 flash无法擦除

通过bushound调试代码发现&#xff0c;当上位机发送命令到模组后flash将不能擦除&#xff0c;通过 HAL_FLASH_GetError&#xff08;&#xff09;函数查找原因是FLASH Programming Sequence error&#xff08;编程顺序错误&#xff09;&#xff0c;解决办法是在解锁后清零标志位…...

Android—ANR日志分析

获取ANR日志&#xff1a; ANR路径&#xff1a;/data/anrADB指令&#xff1a;adb bugreport D:\bugrep.zip ANR日志分析步骤&#xff1a; “main” prio&#xff1a;主线程状态beginning of crash&#xff1a;搜索 crash 相关信息CPU usage from&#xff1a;搜索 cpu 使用信息…...

9.29 LeetCode 3304、3300、3301

思路&#xff1a; ⭐进行无限次操作&#xff0c;但是 k 的取值小于 500 &#xff0c;所以当 word 的长度大于 500 时就可以停止操作进行取值了 如果字符为 ‘z’ &#xff0c;单独处理使其变为 ‘a’ 得到得到操作后的新字符串&#xff0c;和原字符串拼接 class Solution { …...

近万字深入讲解iOS常见锁及线程安全

什么是锁&#xff1f; 在程序中&#xff0c;当多个任务&#xff08;或线程&#xff09;同时访问同一个资源时&#xff0c;比如多个操作同时修改一份数据&#xff0c;可能会导致数据不一致。这时候&#xff0c;我们需要“锁”来确保同一时间只有一个任务能够操作这个数据&#…...

linux创建固定大小的文件夹用于测试

在linux上创建固定大小的文件夹用于测试磁盘空间不足时的应用故障。 实验环境为centos7&#xff0c;有两种简易方法&#xff1a; 一、使用ramdisk 1、创建文件夹 mkdir /var/mytest 2、创建一个1m大小的临时文件 mount none /var/mytest -t tmpfs -o size1m size也可以写…...

大模型学习路线:这会是你见过最全最新的大模型学习路线【2024最新】

大模型学习路线 建议先从主流的Llama开始&#xff0c;然后选用中文的Qwen/Baichuan/ChatGLM&#xff0c;先快速上手体验prompt工程&#xff0c;然后再学习其架构&#xff0c;跑微调脚本 如果要深入学习&#xff0c;建议再按以下步骤&#xff0c;从更基础的GPT和BERT学起&…...

了解云计算工作负载保护的重要性,确保数据和应用程序安全

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求&#xff0c;而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端&#xff0c;保护他们的云工作负载&#xff08;指所有部署的应用程序和服务&#xff09;变得越来越重要。云工作负载保护&…...

Swagger3基本使用

Swagger 课程目标 Swagger简介【了解】 Springboot整合swagger【掌握】 Swagger 常用注解【掌握】 knife4j-Swagger【会用】 一、Swagger3简介 Swagger 是一系列 RESTful API 的工具&#xff0c;通过 Swagger 可以获得项目的⼀种交互式文档&#xff0c;客户端 SDK 的自 动…...

如何借助Java批量操作Excel文件?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 | 问题背景 在操作Excel的场景中&#xff0c;通常会有一些针对Excel的批量操作&#xff0c;批量的意思一般有两种&#xff1a; 对批量的Excel文件进行操作。如导入多个Excel文件…...

JUC并发编程_Lock锁

JUC并发编程_Lock锁 1、Lock锁介绍2、主要方法3、与 synchronized 的区别4、Condition 使用示例 1、Lock锁介绍 Java中的 Lock 锁是 java.util.concurrent.locks 包下的一个接口&#xff0c;它提供了比 synchronized 关键字更灵活的锁定机制。 2、主要方法 lock()&#xff1a…...

Unity中的功能解释(数学位置相关和事件)

向量计算 Vector3.Slerp&#xff08;起点坐标&#xff0c;终点坐标&#xff0c;t&#xff09;&#xff0c;可是从起点坐标以一个圆形轨迹到终点坐标&#xff0c;有那么多条轨迹&#xff0c;那怎么办 Vector3.Slerp 进行的是沿球面插值&#xff0c;因此并不是沿着严格的“圆形…...

ElementPlus---Timeline 时间线组件使用示例

介绍 使用ElementPlus时间线组件在后台首页实现通知公告列表展示&#xff0c;使用Vue3开发。 实现代码 Vue3代码 <el-timeline><el-timeline-itemstyle"max-width: 600px"v-for"(activity, index) in activities":key"index":times…...

推荐4款2024年大家都在用的高质量翻译器。

翻译器在我们的生活中有着很重要的作用&#xff0c;不管是我们在学习还是工作&#xff0c;生活娱乐&#xff0c;出国旅游等场合都会派上用场&#xff0c;它是我们解决沟通的障碍&#xff0c;提高阅读效率的好帮手。我自己使用的翻译器有很多&#xff0c;可以给大家列举几款特别…...

Mybatis 返回 Map 对象

一、场景介绍 假设有如下一张学生表&#xff1a; CREATE TABLE student (id int NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(100) NOT NULL COMMENT 姓名,gender varchar(10) NOT NULL COMMENT 性别,grade int NOT NULL COMMENT 年级,PRIMARY KEY (id) ) ENGINEInnoD…...

Vue3(三)路由基本使用、工作模式(history,hash)、query传参和param传参、props配置、编程式路由导航

文章目录 一、路由的基本使用二、路由器的工作模式三、RouterLink中to的两种写法四、嵌套路由五、路由传参1. query传参2. params传参 六、路由的propos配置七、编程式路由导航 一、路由的基本使用 安装&#xff1a;npm i vue-router 在src/pages文件下&#xff0c;创建三个路…...

TypeScript概念讲解

简单来说&#xff0c;TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 标准&#xff1b; TypeScript 由微软开发的自由和开源的编程语言&#xff1b; TypeScript 设计目标是开发大型应用&#xff0c;它可以编译成纯 JavaScript&#xff0c;编译出来的 Jav…...

C++ | Leetcode C++题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; class Solution { public:unordered_map<long long, int> prefix;int dfs(TreeNode *root, long long curr, int targetSum) {if (!root) {return 0;}int ret 0;curr root->val;if (prefix.count(curr - targetSum)) {ret pref…...

回复《对话损友 2》

回复《对话损友 2》 承蒙贵人挂念&#xff0c;亦感激贵人给予这般交流的契机&#xff08;对话损友 2 -- 回复-CSDN博客&#xff09;。我自身也一直期望能留存些岁月的痕迹&#xff0c;然而却常困惑于不知哪些事物值得铭记&#xff0c;哪些又应被永远忘却。 随着时光流转&#x…...

MySQL - 运维篇

一、日志 1. 错误日志 2. 二进制日志 3. 查询日志 记录了所有的增删改查语句以及DDL语句 4. 慢查询日志 二、主从复制 1. 概述 2. 原理 3. 搭建 三、分库分表 1. 介绍 2. Mycat概述 3. Mycat入门 4. Mycat配置 5. Mycat分片 6. Mycat管理及监控 四、读写分离 1. 介绍 2. 一…...

WebGIS开发及市面上各种二三维GIS开发框架对比分析

GIS前端开发是现代WebGIS应用开发中非常重要的一环&#xff0c;通过前端开发框架&#xff0c;可以实现地图展示、交互、分析等功能。本文将介绍当前市面上常用的GIS前端开发框架&#xff0c;并进行对比分析。 Leaflet Leaflet是一款轻量级的开源地图库&#xff0c;它提供了丰…...

[论文精读]TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor

期刊名称&#xff1a;IEEE Transactions on Information Forensics and Security 发布链接&#xff1a;TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor | IEEE Journals & Magazine | IEEE Xplore 中文译名&#xff1a;TorWard&#xff1a;…...

pytest - 多线程提速

import timedef test1_test1():time.sleep(1)assert 1 1, "11"def test1_test2():time.sleep(1)assert 1 1, "11" 上面2个函数&#xff0c;执行情况&#xff1a; 正常执行时&#xff0c;花费 2.08s2个进程执行时&#xff0c;花费 1.18s2个线程执行时&a…...

python中logging的用法

logging.error 是 Python logging 模块中的一个方法&#xff0c;专门用于记录错误级别&#xff08;ERROR&#xff09;的日志信息。logging 模块是 Python 提供的标准日志工具&#xff0c;用于生成各种级别的日志消息&#xff0c;并支持日志的格式化和存储。 logging.error 的基…...

【YOLO目标检测车牌数据集】共10000张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;10000&#xff08;2000张绿牌、8000张蓝牌&#xff09; 标注数量(txt文件个数)&#xff1a;10000 标注类别数&#xff1a;1 标注类别名称&#xff1a;licence 数据集下载&#xff1a;车牌数据…...

gdb xterm 调试 openmpi 程序

1&#xff0c;编写编译一个openmpi程序 迭代计算 PI 的源程序&#xff1a; pi_reduce.c #include <stdio.h>#include <math.h> #include <mpi.h>double f(double); double f(double x) {return (4.0/(1.0x*x)); }int main(int argc, char* argv[]) {int d…...

【STM32】江科大STM32笔记汇总(已完结)

STM32江科大笔记汇总 STM32学习笔记课程简介(01)STM32简介(02)软件安装(03)新建工程(04)GPIO输出(05)LED闪烁& LED流水灯& 蜂鸣器(06)GPIO输入(07)按键控制LED 光敏传感器控制蜂鸣器(08)OLED调试工具(09)OLED显示屏(10)EXTI外部中断(11)对射式红外传感器计次 旋转编码器…...

Java基础扫盲(二)

想看Java基础扫盲&#xff08;一&#xff09;的可以观看我的上篇文章Java基础扫盲 目录 String为什么设计为不可变的 String有长度限制吗 为什么JDK9将String的char[]改为byte[] 泛型中K,T,V,E,Object,?等都代表什么含义 怎么修改一个类中使用了private修饰的String类型…...