Java并发编程入门与高并发面试

239 阅读2分钟

download:Java并发编程入门与高并发面试

本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段(扩容,缓存,队列,拆分等),构建完整的并发与高并发知识体系,胜任实际开发中并发与高并发问题的处理,倍增高薪面试成功率!

适合人群及技术储备要求

无论面试还是实际开发,几乎都会涉及并发相关知识及高并发相关场景处理,如果你想系统的学习一下并发编程

并了解一下实际的高并发场景及应对方案,那这门课就是为你准备的

技术储备要求:

有Java编程基础 / 有Linux基础 / 有MySQL基础 / 至少一个Java项目开发经验

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+5;
int n,a[N];
int cnt=1,flag,res=0;
signed main(){
    cin>>n;if(n==1) return printf("0\n"),0;
    for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
    n=unique(a+1,a+1+n)-a-1,flag=a[2]-a[1];
    for(int i=2;i<n;++i) cnt+=((a[i]-a[i-1])*(a[i]-a[i+1])>0);
    // printf("%d\n",cnt);
    for(;cnt>1;cnt>>=1,res++) if(cnt&1) cnt++,flag=0;
    return printf("%lld\n",res+(flag<0)),0;
}
Problem B妳發現兩種操作完整等價於删掉兩數中的 \(\max\) 或 \(\min\) ,然後妳就能夠變成删除一個數,最後留下的數時 \(1\) 即可,然後隨意計數一下就能夠了。#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
const int MOD=998244353;
int n,a[N],res=0;
int fac[N],ifac[N],ksm[N<<1];
int qpow(int x,int k){
    int res=1;
    for(;k;k>>=1,x=x*x%MOD)
    if(k&1) res=res*x%MOD;
    return res;
}
int cal(int n,int m){
    return fac[n+m]*ifac[n]%MOD*ifac[m]%MOD;
}
int f(int n,int m){
    return cal(n,m)*ksm[n<<1]%MOD*ksm[m<<1]%MOD;
}
signed main(){
    cin>>n,fac[0]=ifac[0]=ksm[0]=1;
    for(int i=1;i<=n;++i) fac[i]=fac[i-1]*i%MOD;
    for(int i=1;i<=n;++i) ifac[i]=qpow(fac[i],MOD-2);
    for(int i=2;i<=(n<<1);i+=2) ksm[i]=ksm[i-2]*(i-1)%MOD;
    for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
    for(int i=1;i<=n;++i) if(a[i]) res+=f(i-1,n-i),res%=MOD;
    return printf("%lld\n",res),0;
}
Problem C這道標題發現 \(a_i\le 100\) ,這意味著我們能夠枚舉 \(A\) 的子集(當然不是直接枚舉了),覺得要從這里動手。我們思索問的信息。我們需求晓得的是在 \(a\) 全部選完的狀況下並且以 \(a\) 結尾的概率是幾。發現枚舉 \(A\) 的子集仿佛沒有什麼用?我們能否能夠嘗試求出選取出每一個 \(A\) 的子集同時結尾爲 \(a\) 的概率,這樣的話我們就能夠經過隨意選 \(A\) 且以 \(a\) 結尾的概率來相減得到了。我們先思索後者如何計算,就是钦定一個 \(a\) 作爲結尾,然後剩下隨機選取前面的概率乘上再選择這個位置的概率。我們發現,關於一個 \(b_i\) ,我們能夠比擬隨便的求出他關於一個匯合時,先選於這個匯合的概率:[P(b_i,S)=\frac{b_i}{bi+\sum{i\in S}a_i} ]然後,我們需求求出的是關於每一個 \(b_i\) ,他後選於全集 \(A\) 的概率 \(p_i\) ,那麼最後的答案就是 \(n+m-\sum_{i=1}^m p_i\)我們思索怎樣求。由於我們能夠求出關於每一個匯合的概率,我們就能夠用總概率減去每一個子集的概率乘上容斥係數就能夠求出後選的概率了。然後就好了。代码#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=105;
const int MOD=998244353;
int n,m,a[N],b[N];
int f[N*N],res=0;
int ksm(int x,int k){
    int res=1;
    for(;k;k>>=1,x=x*x%MOD)
    if(k&1) res=res*x%MOD;
    return res;
}
signed main(){
    cin>>n>>m,res=n+m;
    for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
    for(int i=1;i<=m;++i) scanf("%lld",&b[i]);
    f[0]=1;
    for(int i=1;i<=n;++i){
        for(int j=N*N-1;j>=a[i];--j)
        f[j]+=MOD-f[j-a[i]],f[j]%=MOD;
    }
    for(int i=1;i<=m;++i){
        for(int j=0;j<N*N;++j)
        res+=MOD-f[j]*b[i]%MOD*ksm(b[i]+j,MOD-2)%MOD,res%=MOD;
    }
    return printf("%lld\n",res),0;
}