LeetCode Top100 Liked 题单(序号34~51)

news2025/1/16 19:03:44

​34. Find First and Last Position of Element in Sorted Array ​

题意:找到非递减序列中目标的开头和结尾

我的思路

用二分法把每一个数字都找到,最后返回首尾两个数

代码 Runtime12 ms Beats 33.23% Memory14 MB Beats 5.16%

class Solution {
public:
    void bins(int l,int r,int tar,vector<int>& nums,vector<int>& ans){
        while(l<=r){
            int mid=l+(r-l)/2;
            if(nums[mid]>tar) r=mid-1;
            else if(nums[mid]<tar)l=mid+1;
            else{
                ans.push_back(mid);
                bins(l,mid-1,tar,nums,ans);
                bins(mid+1,r,tar,nums,ans);
                return ;
            }
        }
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        int n=nums.size();
        vector<int> ans;
        bins(0,n-1,target,nums,ans);
        if (ans.empty())return {-1,-1};
        else  sort(ans.begin(),ans.end());
        return {ans[0],ans[ans.size()-1]};
    }
};

标答

可以直接找到序列的头部数字,和数字加一的序列的头部数字

代码 Runtime 3 ms Beats 96.59% Memory13.7 MB Beats 11.32%

class Solution {
public:
    pair<int,int> bins(vector<int>& nums,int tar,int l,int r){
        int ans=-1;
        while(l<=r){
            int mid=(l+r)/2;
            if(tar>nums[mid]) l=mid+1;
            else if(tar<nums[mid]) r=mid-1;
            else{//如果等于的话
                ans=mid;r=mid-1;
            }
        }
        if(ans==-1)return {l,0};
        return {ans,1};
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        int n=(int)nums.size()-1;
        pair<int,int> st;   pair<int,int> en;
        st =bins(nums,target,0,n);
        en =bins(nums,target+1,0,n);
        if(!st.second) return {-1,-1};
        return {st.first,en.first-1};
    }
};

35. Search Insert Position

题意:给定一个有序数组和一个元素,找到给序号,没找到返回他应该插在哪里

我的思路

二分查找,我记得二分查找应该是有upper_bound和lower_bound直接用的

注意:lower_bound函数是返回指针,用于在指定区域内查找不小于目标值的第一个元素,也就是说[1,2,3,5]数组中,target为4的情况下返回的是序号为3;[1,2,3,4]数组中,target为4的情况下返回的是序号为3

upper_bound为大于目标元素的第一个数/位置,[1,2,3,5]数组中,target为4的情况下返回的是序号为3;[1,2,3,4]数组中,target为4的情况下返回的是序号为4

代码 3ms Beats 88.42% 9.63mb Beats 47.66%

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        return lower_bound(nums.begin(), nums.end(), target) - nums.begin();
    }
};

39. Combination Sum

题意:给定一个不同整数数组和一个目标,返回一个单独的集合,使得集合内部和等于target;同一个数字可以用多次;

我的思路

好像是动态规划做的?和背包问题差不多,但是我忘记了orz

标答 动态规划

首先创建一个dp的vector,每个dp的内容是答案的格式,也就是vector<vector<int>>,dp表示的是从第一个数开始target每个数为target时的答案

状态转移方程为 dp[j]=dp[j-i]+i (这里的+时集合加入的意思)

代码 Runtime 18 ms Beats 34.7% Memory14.3 MB Beats 40.40%

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector <vector <vector<int>>> dp(target+1);//首先要开辟空间,不然会runtime error
        dp[0]={{}}; //初始化
        for(int &i:candidates){//对于每一个在候选名单里的
            for(int j=i;j<=target;j++){//对于每个在数组里的i
                for(auto v:dp[j-i]){//v是每一个答案中的集合
                    v.push_back(i);
                    dp[j].push_back(v);//要把更新的集合放回dp[j]中
                }
            }
        }
        return dp[target];
    }
};

标答 递归

递归的方法好像速度更快,首先将数组排序,之后递归,递归的引入参数为num;next是nums的索引,也就是遍历了nums的每一个数字;psol是每一个集合,表示拿或者不拿的可能性;target是目标;result是最后的答案

注意:在一开始要排序,这么做是为了剪枝操作

因为 if(target<0)return; 这一操作同样可以退出递归,但是如果target-candidates[next]<0 的时候推出递归,那么可以剪枝,大大提升速度;如果要达成这target-candidates[next]<0退出的操作,那么就必须要nums排序,这一才能加快速度

注意:psol传入时要引用,不然会拖慢时间

代码 Runtime2 ms Beats 91.39% Memory10.7 MB Beats 84.74%

class Solution {
public:
    void search(vector<int>& candidates, int next, int target, vector<int>& pol, vector<vector<int>> &result){
        if(target==0){//说明结束了
            result.push_back(pol);
            return;
        }
        if(next==candidates.size()||target-candidates[next]<0) return;
        pol.push_back(candidates[next]);//这是拿了,注意拿了还可以接着拿
        search(candidates,next,target-candidates[next],pol,result);
        pol.pop_back();
        search(candidates,next+1,target,pol,result);//这是没拿,没拿就走了

    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        vector<int> pol;vector<vector<int>> result;//初始化
        search(candidates,0,target,pol,result);
        return result;
    }
};

41. First Missing Positive 

题意:给出未排序的nums,返回未在这些数字中的正整数

我的思路

好像博弈论中有这个算法,还涉及位运算?但是忘记了【好吧,答案中没有位运算】

num的长度只有1e5,所以只能写一个O n的算法了

代码 Runtime 38 ms Beats 98.63% Memory41.3 MB Beats 34.99%

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        bool vis[100005]={0};int n=nums.size();
        for(int i=0;i<n;i++){
            if(nums[i]>100000||nums[i]<=0)continue;
            vis[nums[i]]=1;
        }
        for(int i=1;i<=100001;i++){
            if(vis[i]==0)return i;
        }
        return 0;
    }
};

另一道题 涉及位运算

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

输入: [3,0,1]
输出: 2

输入: [9,6,4,2,3,5,7,0,1]
输出: 8

运用位运算来完成,思路为temp ^ nums[ i ] ^ (i + 1),这里的temp值从0开始,因为nums 的值是从0开始,而(i + 1)则是为了取到自然数1,2,3,4,5...等。运算规则如下:假如目标数组nums 值 为 0,1,2,4 自然数对应为1,2,3,4

0 ^ 1 ^ 0 = 1

1 ^ 2 ^ 1 = 2

2 ^ 3 ^ 2 = 3

3 ^ 4 ^ 4 = 3

返回值为3 缺失的数字即为3

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


42. Trapping Rain Water

题意:给一组正整数数组,表示宽度为1的砖块的高度,问能存多少水

我的思路

费案1

单调栈,同时要记录下每个砖块的距离,所以栈里面存的是序号,一层一层的扫描?首先是y等于1之间的砖块,之后是y=2之间的砖块

假设是9 6 2 0 3 0 2 5 ,就是先9和6和3和0放入栈中;【如果一开始是0,就不放进去了】

height【i】=3来了把0弹出来,那么就直接弹出,之后栈顶是2,在计算0的那一个步骤,ans加上min(目前栈顶=2,height【i】=3)的数值,ans+=2;

目前栈顶是2,发现小于等于height【i】=3,那么就直接弹出,之后栈顶是6,在计算2的那一个步骤,ans+=id的差=2 * (height【i】=3 - 上一个弹出的数=2)的数值,ans+=2;当前栈为9 6 3

height【i】=0,不弹出;

height【i】=2,把0弹出来,直接弹出,之后栈顶是3,在计算0的那一个步骤,ans+=id的差=1 * (height【i】=2 - 上一个弹出的数=0),ans+=2,目前栈为9 6 3 2

height【i】=5,目前栈顶是2,发现小于等于height【i】=5,直接弹出,之后栈顶是3,在计算0的那一个步骤所以ans=ans+(i=7  - top的序号=6-1 )*(height【i】 - 上一个弹出的值=2),ans+=0,当前栈为9 6 3     ans不对

费案2

减法,先减去砖块占用水的体积

例如1 0 2 0 3 0 2 5 ,从右向左,mx=5,扫完一遍了,假设-1的位置有无限高的墙,

所以ans=【7-(-1)-1】*5-所有砖块的体积,不对

标答 双指针法 竖着加的

和上面的减法的思路差不多,但他是一个个竖着加起来

lmax代表最左边的墙,rmax代表最右边的墙前两个if表示的是目前的lmax和rmax都不是最高的,应该要更新;第三个条件如果rmax大于lmax,ans加上lmax-h[lpos];第四个条件如果lmax大于rmax,ans加上rmax-h[rpos];为什么那么做?因为如果整个盆子左边高于右边,那么右侧的水肯定能装住,如果整个盆子右边高于左边,那么左侧的水肯定能装住。

代码 Runtime6 ms Beats 97.75% Memory19.8 MB Beats 53.37%

注意 lpos<=rpos的等号

class Solution {
public:
    int trap(vector<int>& h) {
        int n=h.size()-1;
        int lmax=h[0],rmax=h[n];
        int lpos=1,rpos=n-1,ans=0;
        while(lpos<=rpos){        //等号
            if(rmax<=h[rpos]){
                rmax=h[rpos];rpos--;
            }
            else if(lmax<=h[lpos]){
                lmax=h[lpos];lpos++;
            }
            else if(rmax>=lmax){
                ans+=(lmax-h[lpos]);lpos++;
            }
            else{
                ans+=(rmax-h[rpos]);rpos--;
            }
        }
        return ans;
    }
};

标答 前缀和 竖着加的

dp[i]表示从左到右以左边的边作为最高的边,每个横坐标 i 能装多少水;之后从右到左,以右边的边作为最高的边,res在每个横坐标 i 上加上min ( 当前的最高 - dp[i] )

代码 Runtime 12 ms Beats 78.67% Memory19.8 MB Beats 53.37%

class Solution {
public:
    int trap(vector<int>& h) {
        int n=h.size(),dp[20004]={0};
        int curmax=-1,ans=0;
        for(int i=0;i<n;i++){
            curmax=max(curmax,h[i]);
            dp[i]=curmax-h[i];
        }
        curmax=-1;
        for(int i=n-1;i>=0;i--){
            curmax=max(curmax,h[i]);
            ans+=min(dp[i],curmax-h[i]);
        }
        return ans;
    }
};

标答 单调栈 横着加的

和费案1的思路相仿。栈中的数字越来越小,如果来了一个大的数,把这个数弹出,设cur是这个弹出的数,diff的序号的差,ans+=(min(当前栈顶的数,height[i] ) - 上一个弹出的数)*序号的差

为什么想费案1的时候没有想出来呢?

height【i】=5,目前栈顶是2,发现小于等于height【i】=5,直接弹出,之后栈顶是3,在计算0的那一个步骤所以ans=ans+(i=7  - top的序号=6-1 )*(height【i】 - 上一个弹出的值=2),ans+=0,当前栈为9 6 3 

因为从最上面的图中可以看出,之前的步骤都是ans+=(min(当前栈顶的数,height[i] ) - 上一个弹出的数),但是当h[i]=5时,ans+=(当前栈顶的数 上一个弹出的数),没有办法把公式统一起来,所以没做出来,明明只要加上取最小就可以了

为什么是取最小呢?

原理和标答1的原理是差不多的,因为答案是和两侧最小的那一条有关

补充:

1. 费案1中的栈根本不需要pair结构,因为有序号有数组就知道了数值了

2. if(st.empty())break;这条语句是指左边没有边可以作为盘子的左边了,装不下水了,所以break了

代码 Runtime 12 ms Beats 78.67% Memory19.8 MB Beats 53.37%

class Solution {
public:
    int trap(vector<int>& h) {
        stack<int> st;int n=h.size(),ans=0;
        for(int i=0;i<n;i++){
            while(!st.empty()&&h[st.top()]<h[i]){//弹出操作
                int temp=st.top();
                st.pop();
                if(st.empty())break;//注意这句话
                int cha=i-st.top()-1;//注意这里是-1!!!!!!!
                ans+=(min(h[i],h[st.top()])-h[temp])*cha;
            }
            st.push(i);
        }
        return ans;
    }
};

45. Jump Game II

题意:有n个序号从0开始的数组,你可以从num[i],向右跳到【num[i],num[i+j]】之间

我的思路

动态规划,dp表示需要最少的次数,一开始初始化为无穷,dp[n-1]=0,最外层循环是i从n-1到0,第二层循环是j从1到num[i],找到循环中最小的dp[i+j],dp[i]=min( dp[ i + j ] + 1 ),返回答案dp[0]

但不幸的是n是1e4,nums是1e3,时间复杂度1e7

代码 Runtime128 ms Beats 39.88% Memory16.8 MB Beats 41.3%

class Solution {
public:
    int jump(vector<int>& nums) {
        int n=nums.size();
        int dp[10004];
        for(int i=0;i<n;i++)dp[i]=9999;
        dp[n-1]=0;
        for(int i=n-2;i>=0;i--){
            int minn=9999;
            for(int j=1;j<=nums[i] && i+j<n;j++) minn=min(minn,dp[i+j]);
            dp[i]=minn+1;
        }
        return dp[0];
    }
};

要优化的话肯定是优化第二个循环,快速找到某个范围内的最小值,想到树状数组,去看了看树状数组的板子,找到的树状数组代码维护的是【1,i】范围的最小值,网上说只有树状数组套树状数组或者线段树才可以达到动态维护区间最小值

但是线段树要从1开始建立,同时修改的时候不是单纯的增减,而是直接替换,所以线段树也不适合

标答 贪心

为什么可以用贪心算法呢?

乍一看想到动态规划去了,才发现忽略了最大步长的信息(没有的话就是DP了),因此不需要考虑跳多了的情况,而且题面能够保证绝对能到达,所以不用担心0步长的情形(跳不出去啦!)。

因此本题可以直接使用贪心算法:向后遍历,找出能够跳的最远的选择。

贪心最麻烦的地方就是全局最优解的证明,我这里给出一个简单的思路:从同一个起点出发,如果当前选择不是贪心选择的,那么下一个选择必然比贪心方案跳的更近。完成一次跳跃后有两种情形:贪心方案的第二次选择的位置是否存在于当前方案的第二次选择中。存在,则最多选择这个方案,此时当前方案会比贪心方案段(第二次选择一样,但是第一次选择短了);不存在,那么肯定是会短的(两次选择都短)。


参考链接:https://blog.csdn.net/cary_leo/article/details/115451900

简单来说就是比谁跳的远

代码 Runtime 8 ms Beats 95.22% Memory16.6 MB Beats 64.1%

class Solution {
public:
    int jump(vector<int>& nums) {
        int n=nums.size(),ans=0;
        for(int i=1;i<n;i++){//要么选择在这一格跳走,要么就留在这里
            nums[i]=max(nums[i-1],nums[i]+i);//nums代表在i位置可以到达的最远的位置
        }
        int st=0;
        while(st<n-1){
            ans++; st=nums[st];
        }
        return ans;
    }
};


46. Permutations

题意:有一个数组,里面的数字各不相同,返回所有排列

我的思路

用dfs做,没写出来;我好像还记得C++库中有个直接全排列的调用

标答 dfs 回溯法

照着我写坏的和表达对照一下,我用了两次dfs,一次是没取走数字,一次是取走了数字;不需要没取走数字的那一组,因为他会因为个数不够而不能加入最终答案的vector,所以只要取走的那一次dfs就可以了

代码 Runtime 6 ms Beats 18.86% Memory8.2 MB Beats 11.7%

class Solution {
public:
    void dfs(vector<int>& nums,vector<int>& pol,vector<vector<int>>& ans,vector<int> vis){
        if(pol.size()==nums.size()){ans.push_back(pol);return;}
        for(int i=0;i<nums.size();i++){
            if(vis[i]) continue;
            vis[i]=1;
            pol.push_back(nums[i]);
            dfs(nums,pol,ans,vis);
            pol.pop_back();
            vis[i]=0;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<int> pol; vector<vector<int>> ans; 
        vector<int> vis((int)nums.size(),0);
        dfs(nums,pol,ans,vis);
        return ans;
    }
};

标答 dfs 交换

确实,不断交换就可以排序完成了,还不会有多余的没到个数的pol(和上一个做法不同)

代码 Runtime 5 ms Beats 29.21% Memory 7.5 MB Beats 81.96%

class Solution {
public:
    vector<vector<int>> result;
    void permutation(vector<int> &nums,int i,int n){
        if(i==n){
            result.push_back(nums);
            return ;
        }
        for(int j=i;j<=n;j++){
            swap( nums[i],nums[j]);
            permutation(nums,i+1,n);//注意这里是i+1
            swap( nums[i],nums[j]);
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        permutation(nums,0,nums.size()-1);
        return result;
    }
};

48. Rotate Image 

题意:将整个矩阵顺时针旋转90度,注意不要新开一个矩阵

我的思路

按照这个顺序,一个圈层只要3组交换就可以了,实际操作的时候注意 i 和 j 的范围!!!!!

例子1:初始

1 2 3

4 5 6

7 8 9

第一次

7 2 3

8 5 6

9 4 1

第二次

7 2 1

8 5 4

9 6 3

第三次

7 4 1

8 5 2

9 6 3

例子2:初始

4 8

3 6

第一次

3 8

6 4

第二次

3 4

6 8

第三次

循环直接结束了

代码 Runtime 0 ms Beats 100% Memory 7.2 MB Beats 14.63%

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n=matrix.size();
        for(int i=0;i<n/2;i++){//圈层
            for(int j=i;j<n-i;j++){
                swap(matrix[j][i],matrix[n-1-i][j]);
            }
            for(int j=i+1;j<n-i;j++){
                swap(matrix[n-1-i][j],matrix[n-1-j][n-1-i]);
            }
            for(int j=i+1;j<n-1-i;j++){
                swap(matrix[i][j],matrix[j][n-1-i]);
            }
        }
    }
};

标答 思维

先对角反转,之后逆向

例子1:初始

1 2 3

4 5 6

7 8 9

第一次

1 4 7

2 5 8

3 6 9

第二次

7 4 1

8 5 2

9 6 3

代码 Runtime 0 ms Beats 100% Memory7.3 MB Beats14.63%

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        vector<vector<int>> temp(n, vector<int>(m, 0));
        for(int i=0; i<n; i++){
            for(int j=0; j<i; j++){
                swap(matrix[i][j], matrix[j][i]);
            }
        }
        for(int i=0; i<n; i++){
            reverse(matrix[i].begin(), matrix[i].end());
        }
    }
};


49. Group Anagrams

题意:给一组字符串,把字母相同的字符串放在一组里

我的思路

只能想到死做,就是map映射,key是字典序排列,value是vector<string>,之后遍历map,组成答案

代码 Runtime 30 ms Beats83.8% Memory20.8 MB Beats 30.73%

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        map<string,vector<string> > mp;
        int n=strs.size();
        for(int i=0;i<n;i++){
            string tmp=strs[i];
            sort(tmp.begin(),tmp.end());
            mp[tmp].push_back(strs[i]);
        }
        vector< vector<string> > ans;
        for(auto q:mp)
            ans.push_back(q.second);
        return ans;
    }
};

优化

看了标答,确实是这样做的,但是sort和map和遍历可以优化,map改成unorder_map,for(auto q:mp)加上引用【这一步突然时间少一半】

代码 Runtime 15 ms Beats 99.87% Memory19.5 MB Beats 84.31%

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,vector<string> > mp;
        int n=strs.size();
        for(int i=0;i<n;i++){
            string tmp=strs[i];
            sort(tmp.begin(),tmp.end());
            mp[tmp].push_back(strs[i]);
        }
        vector< vector<string> > ans;
        for(auto &q:mp)
            ans.push_back(q.second);
        return ans;
    }
};

51. N-Queens

题意:皇后攻击的范围是所属的横线、竖线、斜线,在n*n的棋盘上摆放皇后,使得n个皇后不会互相攻击

我的思路

递归

代码 Runtime4 ms Beats 78.35% Memory7.8 MB Beats 36.39%

class Solution {
public:
    bool check(int n,int id, int j, vector<int>&pol){
        for(int i=0;i<pol.size();i++)
            if(pol[i]==j) return 0;
        for(int i=0;i<pol.size();i++){
            if(pol[i]-i ==j-id)return 0;
        }
        for(int i=0;i<pol.size();i++){
            if(pol[i]+i ==j+id)return 0;
        }
        return 1;
    }
    void se(int n,int id, vector<int>&pol, vector<vector<string>> & result) {
        if(pol.size()==n){
            vector<string> mp;
            for(int j=0;j<n;j++){//列
                string s (n, '.');
                s[pol[j]]='Q';
                mp.push_back(s);
            }
            result.push_back(mp);
            return;
        }
        for(int j=0;j<n;j++){//列
            if(!check(n,id,j,pol))//判断这一列上有无其他数字,判断斜线上有无其他数字;如果不可以放在这里,就跳过
                continue;
            pol.push_back(j);
            se(n,id+1,pol,result);
            pol.pop_back();
        }
    }

    vector<vector<string>> solveNQueens(int n) {
        vector<int> pol; 
        vector<vector<string>> result;//假设返回的vector<int>表示每一行的皇后放在第n列
        se(n,0,pol,result);//id代表在第几行
        return result;
    }
};

优化 位运算 没看懂

10394 用位运算速解 n 皇后问题 - 知乎 (zhihu.com)

class Solution {
public:
    vector <vector <string>> ans;
    void solve(int n, int row, int colMask, int leftDiagMask, int rightDiagMask, vector <string> &board) {
        if (row == n) {
            ans.push_back(board);
            return;
        }
        int rowState = (colMask | leftDiagMask | rightDiagMask) & ((1 << n) - 1);
        int safePos = rowState ^ ((1 << n) - 1);
        while (safePos) {
            int queenPos = safePos & (-safePos);
            safePos -= queenPos;
            if (!(queenPos & rowState)) {
                board[row][log2(queenPos)] = 'Q';
                solve(n, row + 1, colMask | queenPos, (leftDiagMask | queenPos) << 1, (rightDiagMask | queenPos) >> 1, board);
                board[row][log2(queenPos)] = '.';
            }
        }
    }
    vector<vector<string>> solveNQueens(int n) {
        vector <string> board(n, string (n, '.'));
        solve(n, 0, 0, 0, 0, board);
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何借助数字化为企业管理赋能?

数字化可以利用技术简化流程、增强决策并提高整体效率&#xff0c;从而显着增强企业管理能力。以下是有关如何使用数字化赋能企业管理的分步指南&#xff1a; 1.评估当前流程和需求&#xff1a; 了解您当前的业务流程、痛点以及可以从数字化中受益的领域。确定您想要解决的具体…

函数递归专题(案例超详解一篇讲通透)

函数递归 前言1.递归案例:案例一&#xff1a;取球问题案例二&#xff1a;求斐波那契额数列案例三&#xff1a;函数实现n的k次方案例四&#xff1a;输入一个非负整数&#xff0c;返回组成它的数字之和案例五&#xff1a;元素逆置案例六&#xff1a;实现strlen案例七&#xff1a;…

Python爱心光波

文章目录 前言Turtle入门简单案例入门函数 爱心光波程序设计程序分析 尾声 前言 七夕要来啦&#xff0c;博主在闲暇之余创作了一个爱心光波&#xff0c;感兴趣的小伙伴们快来看看吧&#xff01; Turtle入门 Turtle 是一个简单而直观的绘图工具&#xff0c;它可以帮助你通过简…

avue 时间选择器限制时间范围(当天以后的时间、当前月、当前月剩余时间)

时间选择器做项目时必不可少的组件&#xff0c; 今天就简单举几个常用的例子供参考。 <avue-form v-model"form" :option"option"></avue-form><script> export default {data() {return {form:{},option:{column: [{label: "禁止日…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)八:自定义组件封装上

一、本章内容 本章实现一些自定义组件的封装,包括数据字典组件的封装、下拉列表组件封装、复选框单选框组件封装、单选框组件封装、文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 ![在这里插入图…

阿里云OSS对象存储的核心概念与购买应用

文章目录 1.OSS对象存储基本介绍1.1.OSS对象存储概念1.2.NAS与OSS存储的不同1.3.OSS的应用场景1.4.OSS术语对应表 2.购买OSS存储资源包3.KodCloud云盘接入OSS对象存储3.1.创建Bucket存储空间3.2.创建子用户用于管理Bucket3.3.获取用户的AccessKey3.3.为用户设置权限3.4.将Bucke…

ceph数据分布

ceph的存储是无主结构&#xff0c;数据分布依赖client来计算&#xff0c;有两个条主要路径。 1、数据到PG 2、PG 到OSD 有两个假设&#xff1a; 第一&#xff0c;pg的数量稳定&#xff0c;可以认为保持不变&#xff1b; 第二&#xff0c; OSD的数量可以增减&#xff0c;OSD的…

.NET6导入导出Excel

一、使用NPOI导出Excel //引入NPOI包 HTML <input type"button" class"layui-btn layui-btn-blue2 layui-btn-sm" id"ExportExcel" onclick"ExportExcel()" value"导出" />JS //导出Excelfunction ExportExcel() {…

判断推理 -- 图形推理 -- 属性规律

中心对称&#xff1a;取一个点&#xff0c;穿过中心能找到另一个对称点。把轴对称 中心对称标出来。五角星不是中心对称。 BD对称轴方向相同&#xff0c;但135自带对称轴&#xff0c;24没带&#xff0c;所以6应该不带对称轴。 百分号不是轴对称。 白色对称轴 平行 或者 夹角…

Python项目实战:创建 + 激活虚拟环境

文章目录 步骤一&#xff1a;新建虚拟环境 激活虚拟环境&#xff08;1.1&#xff09;BUG&#xff1a;激活后显示的Python版本与新建时指定的并不相同。&#xff08;1.2&#xff09;激活成功&#xff1a;在Anaconda软件的环境配置中&#xff0c; 将出现一个py39的虚拟环境。 步…

描述符(__get__和__set__和__delete__)

目录 一、描述符 二、描述符的作用 2.1 何时&#xff0c;何地&#xff0c;会触发这三个方法的执行 三、两种描述符 3.1 数据描述符 3.2 非数据描述符 四、描述符注意事项 五、使用描述符 5.1 牛刀小试 5.2 拔刀相助 5.3 磨刀霍霍 5.4 大刀阔斧 5.4.1 类的装饰器:无…

【校招VIP】常见产品分析之微信

考点介绍&#xff1a; 面试对微信功能的分析和提问是非常常见的&#xff0c;一方面需要明确微信自身产品功能的特点和取舍&#xff0c;另一方面也需要与同类的社交APP进行对比思考分析。 『常见产品分析之微信』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考…

《2023年度数据安全与管理状况报告》:勒索威胁激增!

上半年发布的《2023年度数据安全与管理状况报告》揭示出数据安全领域的重要趋势和问题。报告显示&#xff0c;勒索活动日益增多&#xff0c;可大多数企业仍然缺乏必要的网络复原策略和数据安全能力来应对威胁并保持业务连续性。 93%的受访者表示&#xff0c;今年勒索软件攻击的…

C语言实现epoll简洁代码

1.1、函数定义 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);作用&#xff1a; 等待监听的所有fd相应事件的产生。 1.2、参数详解&#xff1a; 1) int epfd&#xff1a; epoll_create()函数返回的epoll实例的句柄。 2) struct epol…

Centos7下python3安装gdal库

Background GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。Github地址&#xff1a;https://github.com/OSGeo/gdal每一个地理空间…

SpringBoot概述及项目的创建使用

文章目录 一. Spring Boot概述1. 什么是Spring Boot&#xff1f;2. Spring Boot的优点 二. Spring Boot项目的创建1. 使用IDEA创建1.1. 准备工作1.2. 创建运行Spring Boot项目1.3. 进行Web交互1.4. 目录工程介绍1.5. 项目快速添加依赖1.6. 防止配置文件乱码所需的配置1.7. Spri…

电商订单履约-卖家发货演化史

1 背景 订单的履约之路就是从发货开始&#xff0c;看似简单的发货功能&#xff0c;其背后却藏着许多的小秘密。 发货的业务特点&#xff1a; B端业务&#xff0c;性能要求不高&#xff0c;因为存在批量发货的场景。 发货时间比较分散&#xff0c;所以并发量不大。 业务复杂…

Studio One6.2Pro最新中文版Win+Mac新功能与BUG修复

无论你是第一次接触数字音乐工作站&#xff08;DAW&#xff09;&#xff0c;还是第一次尝试 制作属于自己的音乐&#xff0c;Studio One 都能给你非凡的体验&#xff01;如果您是一名音乐制作人&#xff0c;您是否曾经为了寻找一个合适的音频工作站而苦恼过&#xff1f;Studio …

力扣:64. 最小路径和(Python3)

题目&#xff1a; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a…

例行性工作

上述方法关机就没了&#xff0c;开机需要再次挂载&#xff0c;我们可以设置开机自动挂载&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 一、单一执行的例行性工作 1、at命令的工作过程 默认有黑名单&#xff0c;黑名单里面没有人&#xff0c;没有allow&#xff0c;表示…