笔试强训:Week-4

5分钟搞定单细胞marker基因气泡图:scDotPlot保姆级教程(含Seurat适配) 本文提供了一份详细的scDotPlot R包使用教程,帮助用户在5分钟内完成单细胞marker基因气泡图的绘制。教程涵盖环境准备、Seurat和SingleCellExperiment对象的适配处理、进阶可视化技巧及自动化报告生成,特别适合生物信息学新手和临床研究者快速掌握这一高效的可视化工具。 阅读详情

目录

一*、小易的升级之路(数学)

二、礼物的最大价值(路径dp)

三*、对称之美(双指针/哈希)

四、经此一役小红所向无敌

五*、连续子数组最大和(线性dp)

六*、非对称之美(贪心+找规律)

七*、爱丽丝的人偶(贪心)

八*、集合(排序+双指针 / set去重)

九、最长回文子序列(区间dp)

十*、添加字符(枚举)

十一*、数组变换(贪心+位运算+数学)

十二、装箱问题(01背包)

十三*、打怪(模拟+数学)

十四、字符串分类(排序+哈希)

十五*、城市群数量(floodfill)

十六、判断是不是平衡二叉树(递归)

十七、最大子矩阵(二维前缀和)

十八*、小葱的01串(定长滑动窗口)


一*、小易的升级之路(数学)

小易的升级之路_牛客题霸_牛客网

就是求最大公约数,直接用gcd函数,不过得记得头文件 #include<numeric>

如果是暴力的话会超时,或者手搓一个gcd函数,这里推荐使用欧几里得算法,时间复杂度最低。

可以进一步优化,说实话还是感觉上面的代码更好理解。

记得这种算法可以用装修用固定大小的瓷砖填地板解释,或者该用切蛋糕来解释吧,比如我有一块24x16(cm)的蛋糕,要求切成大小相同的正方形蛋糕,但不能剩余,问切出的蛋糕最大边长是多少?答案就是24和16的最大公约数。而欧几里得算法得到这个最大公约数的求解过程,就可以理解为:

第一次用较小的边尝试,切出一块16x16的蛋糕,但是有剩余,不符合题意,那么我们就要去更小的那部分里边找边长更小的正方形(这里边找出的结果,最终在更大的那部分比如这里是16x16,一定能切出很多结果边长大小的正方形,并且一定不会有剩余),然后继续在小的里边继续切,思路依然是用小的那条边当作大小来切。然后找到8,8可以,且较大边%8==0,a=temp(8),b=a%b也就是等于0,然后下一次循环,b==0退出循环,a==8就是最终结果。也就是说,我们每次都选择较小边当作切成的蛋糕大小,如果没有剩余,那么此时就是最大公约数。如果有剩余,那么我们以剩下那部分的两条边长作为参数,不断进行这种操作,直到出现结果。妙啊。

代码实现如下:

#include <iostream>
#include <numeric>
using namespace std;
using LL=long long;
int main() {
    LL n,x;
    cin>>n>>x;
    LL Mlevel;
    for(int i=0;i<n;++i)
    {
        cin>>Mlevel;
        if(x>=Mlevel)x+=Mlevel;
        else
        {
            x+=gcd(x, Mlevel);
        }
    }
    cout<<x;
    return 0;
}

二、礼物的最大价值(路径dp)

礼物的最大价值_牛客题霸_牛客网

相当基础的路径dp题,不知道是不是第一天所以这么简单?

#include <vector>
class Solution {
public:
    int maxValue(vector<vector<int> >& grid) {
        int m=grid.size(),n=grid[0].size();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        for(int i=1;i<=m;++i)
        {
            for(int j=1;j<=n;++j)
            {
                dp[i][j]=grid[i-1][j-1]+max(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[m][n];
    }
};

三*、对称之美(双指针/哈希)

对称之美

解法一:双指针

开始还以为要dfs全排列,然后判断是不是回文,心想这太复杂了,然后写出dfs全排列+判断回文的代码,运行过了ok提交,果不其然超时了。然后想着想着不就是判断1对应n-1,2对应n-2以此类推判断是不是有重复元素嘛,这样现将字符串存进数组,然后用双指针就能搞定了,写一个判断回文的函数不就是判断有没有Same

代码实现如下:

#include <iostream>
#include <ostream>
using namespace std;
#include<vector>
#include<algorithm>
bool HasSameChar(string s1,string s2)
{
    sort(s1.begin(),s1.end());
    sort(s2.begin(),s2.end());
    int cur1=0,cur2=0;
    while(cur1<s1.size()&&cur2<s2.size())
    {
        if(s1[cur1]<s2[cur2])++cur1;
        else if(s1[cur1]>s2[cur2])++cur2;
        else return true;
    } 
    return false; 
}
int main() {
    int t;
    cin>>t;
    int n;
    while(t--)
    {
        cin>>n;
        vector<string> s(n);
        for(int i=0;i<n;++i)cin>>s[i];
        //因为输出的二元性,所以我用bool变量来标识
        bool flag=true;
        int left=0,right=n-1;
        while(left<right)
        {
            if(!HasSameChar(s[left], s[right]))
            {
                flag=false;
                break;
            }
            ++left;
            --right;
        }
        if(flag)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

解法二:哈希

判重判重,第一个想到的不就是哈希嘛

我们用一个二维数组来模拟哈希表的思路,第一个位置表示第几个字符串,第二个位置用于表示哪个字母,所以我们开[101][26]这样的大小

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
bool vis[110][26];//用来标记每一行 字母是否存在
int t,n;
string s;
bool check(int left,int right){
    //26个字母暴力检查有没有
    for(int i=0;i<26;++i)
        if(vis[left][i]&&vis[right][i]) return true;
    return false;
}
int main(){
    cin>>t;
    while(t--){
        //先清空hash表
        memset(vis,0,sizeof vis);
        cin>>n;//知道了有多少个字符串
        for(int i=0;i<n;++i){
            cin>>s;
            for(auto&ch:s) vis[i][ch-'a']=true;
        }
        //双指针向中间靠
        int left=0,right=n-1;
        for(;left<right;++left,--right)
            if(!check(left,right)) break;
        //left<right为假说明只是越界导致结束,输出Yes
        cout<<(left<right?"No":"Yes")<<endl;
    }
    return 0;
}

今天三道都写出来了,希望明天也能都写出来hhh\(^o^)/~

实则不然

四、经此一役小红所向无敌

经此一役小红所向无敌

模拟:会超时

#include <iostream>
using namespace std;
using LL=long long;
int main() {
    LL a,h,b,k;
    cin>>a>>h>>b>>k;
    LL sum=0;
    while(h&&k)
    {
        sum+=(a+b);
        h-=b;
        k-=a;
        if(h<=0&&k<=0)break;
        if(h<=0&&k)
        {
            sum+=(b*10);
            break;
        }
        if(k<=0&&h)
        {
            sum+=(a*10);
            break;
        }
    }
    cout<<sum;
    return 0;
}

优化一下就是,提前统计一下互砍的次数,取min

#include<iostream>
using namespace std;
typedef long long LL;
LL a,h,b,k;
int main(){
    cin>>a>>h>>b>>k;
    LL ret=0;//累计伤害
    //看看两个人能互砍多少回合
    LL n=min(h/b,k/a);
    ret+=n*(a+b);
    //计算剩余血量
    h-=b*n;
    k-=a*n;
    //看看是不是都活着 如果都活着就再砍一下
    if(h>0&&k>0){
        h-=b;
        k-=a;
        ret+=a+b;
    }
    //这时候至少死了一个  或者两个都死了
    if(h>0||k>0)  ret+=10*(h>0?a:b);
    cout<<ret<<endl;
    return 0;
}

五*、连续子数组最大和(线性dp)

连续子数组最大和(ACM版本)_牛客题霸_牛客网

没有做出来,看来近期要复习dp了。。。

#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+10;
int nums[N],dp[N];
int n;
int main() {
   cin>>n;
   int ret=-101;
   for(int i=1;i<=n;++i) cin>>nums[i];
   for(int i=1;i<=n;++i){
     dp[i]=max(dp[i-1],0)+nums[i];
     ret=max(dp[i],ret);
   }
   cout<<ret<<endl;
   return 0;
}

六*、非对称之美(贪心+找规律)

非对称之美

所谓题干越短,杀伤力越强?

情况1:所以字符都一样 return 0

情况2:整个串都是回文 return n-1

情况3:整个串不是回文 return n 

佩服。。。。这就是非对称之美吗

#include<iostream>
#include<string>
using namespace std;
string s;
int func(){
    int n=s.size();

    //首先要判断是否全都相同
    int i=1;
    for(;i<n;++i)
        if(s[i]!=s[0]) break;
    if(i==n) return 0;

    //接下来双指针往中间靠,判断整个字符串是否都是回文串
    int left=0,right=n-1;
    for(;left<right;++left,--right)
        if(s[left]!=s[right]) break;

    return left<right?n:n-1;
}
int main(){
    cin>>s;
    cout<<func()<<endl;
    return 0;
}

七*、爱丽丝的人偶(贪心)

爱丽丝的人偶

没有思路

看完解答后发现只要让数组的数据是波形的就行

#include<iostream>
using namespace std;
int n;
int main(){
    cin>>n;
    //必须有单调性,所以就一高一矮 这样放
    int left=1,right=n;
    while(left<=right){
        cout<<left++<<" ";
        if(left<=right) cout<<right--<<" ";
    }
    return 0;
}

八*、集合(排序+双指针 / set去重)

集合_牛客题霸_牛客网

解法一:排序+双指针

因为使用双指针算法,不要忘记排序。此外,注意可能会有重复元素!

其实这也是一种归并思路

#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
const int N=1e4+10;
int a[N],b[N];
int main() {
    cin>>n>>m;
    for(int i=0;i<n;++i) cin>>a[i];
    for(int i=0;i<m;++i) cin>>b[i];
    sort(a,a+n);
    sort(b,b+m);
    //双指针归并 小的插入后++  
    int cur1=0,cur2=0;
    while(cur1<n&&cur2<m){
        if(a[cur1]<b[cur2]){
            cout<<a[cur1++]<<" ";
            while(a[cur1]==a[cur1-1]) ++cur1;
        } 
        else if(a[cur1]>b[cur2]){
            cout<<b[cur2++]<<" ";
            while(b[cur2]==a[cur2-1]) ++cur2;
        }
        else{
            cout<<a[cur1++]<<" ";
            ++cur2;
            while(a[cur1]==a[cur1-1]) ++cur1;
            while(b[cur2]==a[cur2-1]) ++cur2;
        }
    }
    //有一组还没走完
    while(cur1<n){
        if(cur1==0||a[cur1]!=a[cur1-1]) cout<<a[cur1]<<" ";
        ++cur1;
    }
     while(cur2<m){
        if(cur2==0||b[cur2]!=b[cur2-1]) cout<<b[cur2]<<" ";
        ++cur2;
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

解法二:set(set容器默认对数据升序排序,而且会去重)

#include <iostream>
#include <set>
using namespace std;
int n,m;
set<int> s;
int main() {
    cin>>n>>m;
    int x;
    while(n--){
        cin>>x;
        s.insert(x);
    }
    while(m--){
        cin>>x;
        s.insert(x);
    }
    for(auto&e:s) cout<<e<<" ";
    return 0;
}
// 64 位输出请用 printf("%lld")

九、最长回文子序列(区间dp)

最长回文子序列_牛客题霸_牛客网

没想到自己一遍做出来了,开心啊

#include <iostream>
#include <vector>
using namespace std;

int main() {
    //dp[i][j]表示i~j区域内的最长回文子序列
    string s;
    cin>>s;
    int n=s.size(),len=1;
    vector<vector<int>> dp(n,vector<int>(n,1));
    //因为第一个位置会使用后续的位置,所以倒着填
    for(int i=n-1;i>=0;--i)
    {
        for(int j=i+1;j<n;++j)
        {
            if(s[i]==s[j])
            {
                dp[i][j]=i+1<j?dp[i+1][j-1]+2:2;
            }
            else dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
            len=max(len,dp[i][j]);
        }
    }   
    cout<<len;
    return 0;
}

十*、添加字符(枚举)

添加字符_牛客笔试题_牛客网

本来以为是匹配最长的连续的长度,然后字符串长度减去求得的最长长度来做,但是匹配可以在A串的任何一个位置匹配,如果第一个位置不同但后续相同,代码就出错了,比如xello和hello,最终输出5因为求得最长长度为0,但答案应该为1所以还是枚举吧

#include <iostream>
#include <string>
using namespace std;
string a,b;
int main() {
  cin>>a>>b;
  int m=a.size(),n=b.size();
  //不相等的最多就是m个
  int ret=m;
  for(int i=0;i<=n-m;++i){//枚举b的起始位置
      int tmp=0;//统计不同位数的个数
      for(int j=0;j<m;++j)
        if(a[j]!=b[i+j]) ++tmp;
      ret=min(ret,tmp);
  }
  cout<<ret<<endl;
}
// 64 位输出请用 printf("%lld")

十一*、数组变换(贪心+位运算+数学)

数组变换__牛客网

贪心:因为我们每次都需要在一个大一个小的数里面,看小的数不断x2操作能不能达到更大的那个数,因为如果两个数通过乘2操作能相等,那么小的数乘以一定次数的2就能等于大的数。那么现在这个“更大的数”可能会有更大的数,那么就要看这个大的数能不能不断x2操作等于它的更大的数。所以我们只需要找到数组里的最大值,然后看其他数能不能通过x2操作达到这个值即可。那么我们只需要判断MAXNUM/arr[i]能不能被2整除即可。

如何判断被2整除?

x&(x-1)==0就代表最高位是1其他全是0,这就是2的倍数。

或者 x-(x&-x)==0,x&-x得到x低位到高位第一个1,如果减去后为0,就说明只有最高位是1,其他位是0,是2的倍数。

#include <iostream>
using namespace std;
int a[51];
int n,maxval;
bool func(){
    for(int i=0;i<n;++i){
        if(maxval%a[i]) return false;
        int x=maxval/a[i];
        //if(x&(x-1)) return false;
        if(x-(x&-x)) return false;
    }
    return true;
}
int main() {
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>a[i];
        maxval=max(maxval,a[i]);
    }
    cout<<(func()?"YES":"NO")<<endl;
}
// 64 位输出请用 printf("%lld")

十二、装箱问题(01背包)

装箱问题

#include<iostream>
using namespace std;
//dp[i][j]表示选前i个物品 容积不超过j  所占的最大容积
const int N=2e4+1;
int arr[31];
int dp[N];
int v,n;
int main(){
    cin>>v>>n;
    for(int i=1;i<=n;++i) cin>>arr[i];
    for(int i=1;i<=n;++i)
        for(int j=v;j>=arr[i];--j)
            dp[j]=max(dp[j],dp[j-arr[i]]+arr[i]);
    cout<<v-dp[v]<<endl;
}

十三*、打怪(模拟+数学)

打怪

monimonimoni,想这个公式模拟了好久,估计是没睡饱

#include <iostream>
using namespace std;

int main() {
    int t;
    cin>>t;
    while(t--)
    {
        int h,a,H,A;
        cin>>h>>a>>H>>A;
        if(A==0||a>=H){cout<<-1<<endl;continue;}
        //times每次杀死怪需要几次攻击
        //times-1对应杀死一只怪受到几次伤害
        int times=H/a+(H%a?1:0);
        //blood是杀一次怪扣的血
        //判断最后一次是否符合,如果刚好可以取模,代表第x个怪的时候,勇者先死,减去这一次
        int blood=(times-1)*A;
        int x=h/blood+(h%blood==0?-1:0);
        cout<<x<<endl;
    }
    return 0;
}

十四、字符串分类(排序+哈希)

字符串分类_牛客笔试题_牛客网

很简单的题目

#include <iostream>
using namespace std;
#include<algorithm>
#include<unordered_map>
int main() {
    int n;
    string s;
    unordered_map<string, int> hash;
    cin>>n;
    while(n--)
    {
        cin>>s;
        sort(s.begin(),s.end());
        hash[s]++;
    }
    cout<<hash.size();
    return 0;
}

十五*、城市群数量(floodfill)

城市群数量_牛客题霸_牛客网

原本以为是遍历下三角,然后统计一下入度,再从1~n里查找入度为0的数量,这样就是城市群的数量。但是这是不正确的。因为:

该题为无向边,没有出度还有入度的概念,所以不能这样统计。

比如2指向1,3指向1,那么此时城市群的数量应该是1.但是按照我们统计入度为0的个数,算出的是2错误

正确解法是floodfill问题的思路,用vis标记连接的城市群

class Solution {
public:
//联通块问题
bool vis[201]={0};//标记每个城市是否被搜索过
int n;
    int citys(vector<vector<int>>& nums) {
        n=nums.size();
        int ret=0;
        for(int i=0;i<n;++i)
          if(!vis[i]){
            ++ret;
            dfs(nums,i);//没被搜索过 就从该点开始找联通块
         }
        return ret;
    }
    void dfs(vector<vector<int>>& nums,int pos){
        vis[pos]=true;
        for(int i=0;i<n;++i)
           if(!vis[i]&&nums[pos][i]) dfs(nums,i);
    }
};

今天三道题也是稳稳拿下

十六、判断是不是平衡二叉树(递归)

判断是不是平衡二叉树_牛客题霸_牛客网

很简单

class Solution {
public:
    int GetDepth(TreeNode*root)
    {
        if(!root)return 0;
        return 1+max(GetDepth(root->left),GetDepth(root->right));
    }
    bool IsBalanced_Solution(TreeNode* root) {
        if(!root)return true;
        if(!IsBalanced_Solution(root->left))return false;
        if(!IsBalanced_Solution(root->right))return false;
        int LeftDepth=GetDepth(root->left),RightDepth=GetDepth(root->right);
        if(abs(LeftDepth-RightDepth)>1)return false;
        return true;
    }
};

十七、最大子矩阵(二维前缀和)

最大子矩阵_牛客题霸_牛客网

一遍过

#include <climits>
#include <iostream>
using namespace std;
#include<vector>
int main() {
    int N;cin>>N;
    vector<vector<int>> martix(N+1,vector<int>(N+1));
    auto FrontSum=martix;
    int res=INT_MIN;
    for(int i=1;i<=N;++i)
    {
        for(int j=1;j<=N;++j)
        {
            cin>>martix[i][j];
            //计算前缀和
            FrontSum[i][j]=FrontSum[i-1][j]+FrontSum[i][j-1]-FrontSum[i-1][j-1]+martix[i][j];
            res=max(res,FrontSum[i][j]);
            for(int x=1;x<=i;++x)
            {
                for(int y=1;y<=j;++y)
                {
                    //计算区间前缀和
                    int Sum=FrontSum[i][j]-FrontSum[i][y-1]-FrontSum[x-1][j]+FrontSum[x-1][y-1];
                    res=max(res,Sum);
                }
            }
            
        }
    }
    cout<<res;
    return 0;
}

十八*、小葱的01串(定长滑动窗口)

小葱的01串

看完题目觉得就是求定长窗口0,1数量如果等于0,1总数的一半就++计数器,然后最后输出计数器乘以2?应该不对,如果头位置和尾位置在窗口里且符合的时候,其实是同一种情况。只有窗口在不包含头尾的中间位置的时候的解决方案才是需要*2的。

#include <iostream>
using namespace std;

int main() {
    int n;cin>>n;
    string s;
    cin>>s;
    int Num0=0,Num1=0,count0=0,count1=0,solves=0;
    for(auto&ch:s)
    {
        if(ch-'0')++Num1;
        else ++Num0;
    }
    for(int i=0;i<n/2;++i)
    {
        if(s[i]=='0')++count0;
        else ++count1;
    }
    int right=n/2,left=0;
    int flag=0;
    if(count0==Num0/2&&count1==Num1/2){++solves;flag=2;}
    while(right<n)
    {

        if(s[right]=='0')++count0;
        else ++count1;
        if(s[left]=='0')--count0;
        else --count1;

        if(count0==Num0/2&&count1==Num1/2)++solves;
           
        ++right;
        ++left;
    }
    cout<<(solves-flag)*2+flag;
    return 0;
}

或者说,因为1和n-1包含在窗口里时是属于同一种情况,我们只需要从0遍历到n-2的位置即可

#include <iostream>
using namespace std;

int main() {
    int n;cin>>n;
    string s;
    cin>>s;
    int Num0=0,Num1=0,count0=0,count1=0,solves=0;
    for(auto&ch:s)
    {
        if(ch-'0')++Num1;
        else ++Num0;
    }
    for(int i=0;i<n/2-1;++i)
    {
        if(s[i]=='0')++count0;
        else ++count1;
    }
    int left=0,right=n/2-1;
    while(right<n-1)
    {

        if(s[right]=='0')++count0;
        else ++count1;
        
        if(count0==Num0/2&&count1==Num1/2)++solves;
        
        if(s[left]=='0')--count0;
        else --count1;

        ++right;
        ++left;
    }
    cout<<solves*2;
    return 0;
}

本周结束!完结撒花✿✿ヽ(°▽°)ノ✿

别再傻傻分不清!Synopsys DC综合中link/target/symbol/synthetic四大库的保姆级配置指南 本文详细解析了Synopsys DC综合中link_library、target_library、symbol_library和synthetic_library四大库的配置方法,帮助工程师避免常见错误。通过实战示例和调试技巧,指导如何正确设置工艺库与IP库,提升数字芯片设计效率。 阅读详情

相关推荐

海康威视iVMS-4200在银河麒麟系统部署全攻略与疑难排解

在信创国产化进程中,软件兼容性是关键挑战之一。以安防监控领域广泛使用的海康威视iVMS-4200客户端为例,其从Windows环境迁移到银河麒麟等国产操作系统时,面临架构适配、依赖库匹配等核心兼容性问题。这涉及到跨平台软件部署的通用原理:不同CPU架构(如ARM的飞腾、x86的兆芯)和操作系统底层API的差异,要求软件必须进行针对性编译和优化。解决这类问题的技术价值在于保障专业软件在国产化环境中的稳定运行,是信创产业落地的重要环节。具体到应用场景,如在基于银河麒麟V10的安防监控项目中,通过获取对应架构的.

weixin_33423874的博客 1450

笔试强训week4

小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;给出n个字符串,从第1个字符串一直到第n个字符串每个串取一个字母来构成一个新字符串,新字符串的第i个字母只能从第i行的字符串中选出,这样就得到了一个新的长度为n的字符串,请问这个字符串是否有可能为回文字符串?

禊月初三的博客 1255

亚马逊SP-API授权实战:从OAuth流程到Refresh Token获取

本文详细解析了亚马逊SP-API授权流程,从OAuth认证到Refresh Token获取的全过程。通过实战经验分享,帮助开发者快速掌握Marketplace Appstore、Website Workflow和自行授权三种方式,解决常见错误如MD5100和MD9999,并提供了安全存储Refresh Token的最佳实践。

weixin_30379531的博客 518

【笔试强训】Week4:小易的晋升之路,非对称之美,小葱的01串,最长回文子序列,装箱问题

本文包含三道编程题的解题思路与代码实现: 小易的晋升之路:通过模拟和最大公约数计算解决。使用辗转相除法高效计算GCD,根据条件更新初始值x。时间复杂度取决于输入规模。 非对称之美:采用贪心策略判断字符串是否为回文。若全相同字符返回0,若回文但非全相同返回n-1,否则直接返回n。时间复杂度O(n)。 小葱的01串:使用滑动窗口处理环形字符串。统计0/1数量,窗口大小为n/2,满足条件时结果+2。时间复杂度O(n)。 三题均通过合理算法优化,避免了暴力解法可能导致的性能问题。

记录了从0学习Java技术栈的日常 237

基于 Python Flask 的智能个人财务系统

4.财务分析与报告:自动生成财务分析报告,提供图表展示(如饼图、柱状图)帮助用户了解收支状况和财务趋势。9.管理员管理功能:提供管理员模块,允许管理员查看用户财务数据、生成统计报告,并进行用户管理与权限控制。5.资产管理:用户可以记录并追踪个人资产(如房产、车辆、投资等),系统提供资产价值增减情况和趋势分析。3.预算制定与管理:用户根据收入设定每月预算,系统自动对比实际支出与预算差异,实时提醒预算完成情况。6.信用卡管理:提供信用卡账单记录与管理功能,提醒用户信用卡还款日期,避免逾期,帮助管理信用卡消费。

weixin_68689665的博客 424

生物信息学避坑指南:Scissor算法参数alpha和cutoff的黄金设置法则

本文深入解析了生物信息学中Scissor算法的关键参数alpha和cutoff的黄金设置法则,帮助研究者有效整合bulk RNA与单细胞数据,识别单细胞亚群。通过实战验证的调参策略,避开常见陷阱,获得可靠的生物学发现,特别适用于肿瘤异质性研究和免疫细胞分型等场景。

weixin_33734785的博客 451

笔试强训:Week-3

本文整理了18道编程题目及解题思路,涵盖多种算法题型。主要包括:滑动窗口应用(最长无重复子数组、定长窗口问题)、贪心算法(重排字符串、组队竞赛)、动态规划(删除相邻数字的最大分数、01背包)、二分查找(分组问题)、拓扑排序、模拟题以及数学问题等。每道题都提供了核心解题思路和代码实现要点,涉及字符串处理、数组操作、哈希表应用等常见编程技巧。其中特别强调了数据类型选择(如long long防溢出)、边界条件处理等易错点,展现了从暴力解法到优化解法的思考过程。

_dindong的博客 1492

告别零散脚本:用Playwright+Pytest+Yaml+Allure搭建可维护的UI自动化项目

UI自动化测试是软件质量保障的关键环节,其核心在于模拟用户操作,对Web应用界面进行功能验证。传统的脚本堆砌方式常因代码耦合度高、维护成本大而难以为继。工程化解决方案通过分离关注点,将测试逻辑、数据和配置解耦,从而显著提升项目的可读性、可维护性和可扩展性。其技术价值在于构建可持续运行的自动化资产,而非一次性脚本。典型的应用场景包括Web应用的回归测试、兼容性测试及CI/CD流水线中的质量门禁。本文以Playwright、Pytest、Yaml和Allure为核心技术栈,详细阐述了如何从项目架构、页面对象模型

weixin_42529328的博客 299

笔试强训:Week-1

本文整理了牛客网算法题解,涵盖数字统计、数组交集、点击消除、快递费用计算、最小花费爬楼梯等18道题目。主要内容包括:1.数字统计通过枚举和模运算实现;2.数组交集问题提供哈希和双指针两种解法;3.点击消除使用栈结构处理;4.动态规划应用于斐波那契数列和最小花费问题;5.贪心算法在字符串距离和数字处理中的应用;6.深度优先搜索解决单词搜索和岛屿数量问题;7.滑动窗口处理数组子区间问题;8.循环链表和数学方法解决约瑟夫环问题。每道题都给出了核心思路和关键代码实现。

_dindong的博客 1116

DCM07-诊断服务EcuReset ($11 )的配置和实现

文章目录1 诊断服务EcuReset ($11 )1.1 概述1.2 诊断模式声明组1.3 代码实现1.4 配置参数 传送门 ==>> AutoSAR实战系列300讲「糖果Autosar」总目录 1 诊断服务EcuReset ($11 ) 1.1 概述 该服务实现了 ECU 内的复位功能,协议的具体理论讲解请参考「FlashBootloader03【电控单元复位服务($11)】」。在接收到UDS 服务 0x11 的请求时,DCM 模块应触发 ModeDeclarationGroupPrototy

2064

deepstream车道线检测自定义插件化,其中要注意pipeline的配置,如果插件位置配置不对,会报input format should be RGBA when using blur-obje

以上代码中,我们先从对象池中获取一个 DsUserMeta 对象,然后使用 get_lane_line_from_frame 函数获取车道线检测结果,并使用 add_lane_line_meta 函数将其添加到 DsUserMeta 对象中。注意,上述代码中的 get_lane_line_from_frame 函数和 add_lane_line_meta 函数需要你自己实现,用于从视频帧中提取车道线检测结果,并将其添加到 DsUserMeta 中。

pvmsmfchcs的博客 690

笔试强训:Week-6

活动安排_牛客题霸_牛客网0位置相等的按1位置降序排,0位置不等的按0位置升序排,dp填表的时候往前找,如果0位置相等跳过,不等的时候就找有没有1位置比我的0位置小的。如果有直接等于该位置长度+1,贪心的break直接将效率最大化int n;cin>>n;i<n;i<n;i<=n;++i)j>=1;--j)break;return 0;或者不用动规,摘自别人的题解int n;PII arr[N];cin>>n;i<n;i<n;++i)

_dindong的博客 1032

【项目实战】SOVD协议(面向服务的车辆诊断协议)

此外,AUTOSAR组织将SOVD部分内容的软件实现定义在了R22-11及以上版本的AUTOSAR Adaptive规范中,还支持动态发现车内诊断功能、获取高性能计算机(HPC)的Log信息等新的诊断需求,更符合当前软件定义汽车概念下的行业趋势。而SOVDGateway作为边缘节点,也肩负着对SOVD Client进行认证以及权限控制的责任,从而保证车辆的信息安全。相较于传统的UDS(Unified Diagnostic Services)协议,SOVD不仅保留了传统的读写数据、例程控制、故障读取等功能,

奶爸的编程之路,也就一周冷个三天 1905

笔试强训:Week -7

本文总结了多个算法题解,主要包括: 旋转字符串的暴力解法 合并k个排序链表的归并和优先队列方法 滑雪问题的BFS解法 天使果冻的递推优化 矩阵旋转的模拟实现 小红取数的背包问题解法 字符统计的哈希应用 哈夫曼编码的实现 完全平方数的最优解 字符串转换的枚举优化 拓扑排序的BFS实现 合唱队形的序列DP解法 棋子翻转的模拟实现 区间DP问题 过桥问题的贪心+BFS解法 最大差值的优化解法 零钱兑换的完全背包问题 子串统计的滑动窗口技巧

_dindong的博客 822

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

笔试强训:Week -8

本文整理了多个编程题目及解法,涵盖组合数学、排序算法、动态规划、贪心算法等常见题型。包括:1)组合数概率计算;2)排序数组的二分查找/滑动窗口应用;3)循环汉诺塔递推解法;4)最小差值问题;5)DFS求素因子组合;6)贪心+二分求最长子序列;7)双指针处理区间问题;8)BFS最短路径;9)股票交易DP;10)贪心选择AOE/单体;11)N皇后冲突检测;12)区间DP取金币;13)矩阵转置;14)DFS剪枝处理选项组合;15)双指针接雨水;16)贪心求极值;17)栈的贪心排序;18)滑动窗口处理加减操作。所有

_dindong的博客 873

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

笔试强训week3

dd当上了宣传委员,开始组织迎新晚会,已知班里有nnn个同学,每个同学有且仅有一个擅长的声部,把同学们分成恰好mmm组,为了不搞砸节目,每一组里的同学都必须擅长同一个声部,当然,不同组同学擅长同一个声部的情况是可以出现的,毕竟一个声部也可以分成好几个part进行表演,但是他不希望出现任何一组的人过多,否则可能会导致场地分配不协调,也就是说,她希望。若图的拓扑序不唯一,输出任意合法的拓扑序即可。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组。

禊月初三的博客 1771

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

笔试强训week1

每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0... m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客礼品,请你试着想下,哪个小朋友会得到这份礼品呢?比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现 了6次。,a[n],求最小的区间[l,r],使a[l]+a[l+1]+

禊月初三的博客 1270

笔试强训week6

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?她想知道有多少出口是她能到达的,最近的出口离她有多远?

禊月初三的博客 1078

笔试强训:Week -5

本文整理了多个算法题目及解法,涵盖哈希、排序、动态规划、贪心、BFS等算法类型。主要内容包括:1) 笨小猴的质数判断与哈希统计;2) 主持人调度的区间排序解法;3) 分割等和子集的DFS与01背包实现;4) 空调遥控的二分与滑动窗口优化;5) 走迷宫的最短路径BFS解法;6) 最长上升子序列的贪心+二分优化;7) 动态规划解决最长公共子序列问题等。每个题目都提供了核心代码实现,涉及质数判断、二分查找、状态转移等关键算法思想,展示了不同场景下的算法应用与优化技巧。

_dindong的博客 963

笔试强训week2

同时在棋盘上的任一点有一个对方的马(如上图的 C𝐶 点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。棋盘用坐标表示,𝐴 点的坐标为 (0,0)、𝐵 点的坐标为 (𝑛,𝑚) ,马的位置 𝐶 点的坐标为 (𝑋,𝑌)(约定: 𝐶≠𝐴,同时 𝐶≠𝐵)。假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益。正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

禊月初三的博客 1144

笔试强训week8

众所周知,高考数学中有一个题目是给出12个单项选择,每一个选择的答案是 A,B,C,D 中的一个。但是他有一些条件,首先四个选项的数量必须分别为 na,nb,nc,nd。大科学家dd最近在研究转基因白菜,白菜的基因序列由一串大写英文字母构成,dd经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高,于是优秀的dd开始着手修改白菜的基因序列,dd每次修改基因序列的任意位需要的代价是1,dd想知道,修改白菜的基因序列使其高附加值达到最高,所需要的最小代价的是多少。

禊月初三的博客 1121

笔试强训week5

dd作为体操队队长,在给队员们排队形,体操队形为一个单独的纵列,体操队有n个同学,标号为1∼n,对于i(1≤i≤n)号队员,会有一个诉求(1≤a[i]≤n),表示他想排在a[i]号队员前面,当a[i]=i时,我们认为他没有位置需求,随便排哪儿都行,dd想知道有多少种队形方案,可以满足所有队员的要求。有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。

禊月初三的博客 1199

笔试强训week7

例如:1,4,9,和16都是完全平方数,但是2,3,5,8,11等等不是数据范围:1≤𝑛≤10^4​。给定一个𝑛×𝑚的矩阵,矩阵中的数字表示滑雪场各个区域的高度,你可以选择从任意一个区域出发,并滑向任意一个周边的高度严格更低的区域(周边的定义是上下左右相邻的区域)。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。有n个果冻排成一排。有一个长为 n 的数组 A ,求满足 0 ≤ a ≤ b < n 的 A[b] - A[a] 的最大值。

禊月初三的博客 949

笔试强训:Week -2

本文总结了多种算法题解,主要涉及高精度运算、链表操作、动态规划、贪心算法等常见题型。内容包括:大数加减乘除模拟;链表反转与相加;斐波那契数列应用;路径规划DP;股票买卖问题;字符串处理;数学问题求解等。重点展示了如何运用双指针、状态压缩、空间优化等技巧提升算法效率,并提供了多种解题思路的比较分析。文章通过简洁的代码实现和关键算法思路说明,帮助理解各类题型的解题方法。

_dindong的博客 1428

【笔试强训】Week3:重排字符串,分组,DNA序列,01背包

本文介绍了三个算法题的解题思路与实现代码。第一个是字符串重排问题,使用贪心算法处理字符频率,确保相邻字符不同;第二个是分组问题,通过哈希统计和二分查找确定最优分组方案;第三个是DNA序列问题,采用滑动窗口技术查找特定子串。每个问题都提供了清晰的解题思路和对应的Java代码实现,涵盖了贪心算法、二分查找和滑动窗口等常见算法技巧。

记录了从0学习Java技术栈的日常 375

【笔试强训】Week1:点击消除,数组中两个字符串的最小距离,dd爱框框,腐烂的苹果,大数乘法

本文介绍了三种算法题解及IO优化方法。首先针对Java输入输出效率问题,提出了自定义快速读写类Read的方案,通过BufferedReader和StringTokenizer提升IO性能。然后分别解决三个算法问题:1) 使用StringBuilder模拟栈结构实现字符串相邻字符消除;2) 通过双指针动态规划求数组中两个字符串的最小距离;3) 采用滑动窗口算法寻找满足和值条件的最短连续子数组。这些解决方案通过优化数据结构和算法策略,有效提升了处理效率,特别适用于大规模数据场景。

记录了从0学习Java技术栈的日常 401
上一篇: 牛客101:双指针
下一篇: Linux网络编程:应用层协议HTTP
_dindong
博客等级 码龄2年 107粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_dindong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值