算法复习笔记
算法复习
- 最大公约数
- 枚举
- abc
- 反序数
- 模拟
- xxx定律
- 打印数字菱形
- 今年的第几天?
- vector
- 完数VS盈数
- 剩下的树
- 排序和查找
- 顺序查找
- 二分查找
- 找位置
- 字符串
- 统计单词
- 浮点数加法
- 线性数据结构
- 队列
- 约瑟夫问题(队列)
- 计算表达式(栈)
- 递归和分治
- 跳台阶
- 不连续1的子串
- 2的幂次方
- 树
- 二叉树
- 层序建树
- 层序遍历
- 先序遍历
- 二叉树最短路径长度
- 二叉树遍历
- 重建二叉树
- 二叉排序树
- 二叉搜索树
- 优先队列
- 哈夫曼树
- 搜索
- 树的高度
- 玛雅人的密码
- 八皇后
- 数组划分
- 图
- 图的构建:邻接表
- 并查集
- 畅通工程
- 这是一棵树吗
- 最小生成树 kruskal
- 单源最短路径 dijkstra
- 动态规划
- 跳台阶
- 放苹果
- 最长公共子序列
- 最长公共子串
- 最大序列和
- 背包问题
- 铺瓷砖
- 数学问题
- 二进制数
- 质数
- 质数(每100里至少有一个整数)
- 快速幂
最大公约数
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 使用欧几里得算法计算两个数的GCD
int gcd(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;
}// 计算整个数组的GCD
int arrayGCD(const vector<int>& nums) {if (nums.empty()) return 0;int result = nums[0];for (size_t i = 1; i < nums.size(); ++i) {result = gcd(result, nums[i]);// 如果已经得到1,可以提前终止if (result == 1) {break;}}return result;
}int main() {vector<int> arr = {24, 36, 48, 60};int result = arrayGCD(arr);cout << "数组的最大公约数是: " << result << endl;return 0;
}
枚举
abc
#include <iostream>
using namespace std;int main() {int a, b, c;for(int a=0;a<=9;a++){for(int b=0;b<=9;b++){for(int c=0;c<=9;c++){if((a+b)*100+(b+c)*10+2*c==532){printf("%d %d %d\n",a,b,c);}}}}return 0;
}
// 64 位输出请用 printf("%lld")
反序数
#include<iostream>
using namespace std;
int reverse(int n){int res=0;while(n!=0){res+=n%10;res*=10;n/=10;}return res/=10;
}
int main(){for(int i=1000;i<=9999;i++){if(i*9==reverse(i)){printf("%d\n",i);}}return 0;
}
模拟
xxx定律
#include <iostream>
using namespace std;int main() {int n;while(scanf("%d",&n)!=EOF){int res=0;if(n==1){printf("%d",res);continue;}while(true){if(n%2==0){n/=2;}else{n*=3;n++;n/=2;}res++;if(n==1){printf("%d\n",res);break;}}}return 0;
}
打印数字菱形
#include<iostream>
#include<string.h>
using namespace std;
int main(){char str[1000]={0};int n;scanf("%d",&n);int i=0;for(i=0;i<n;i++){int j=0;memset(str,0,1000);for(j=0;j<2*n-2*i;j++){str[j]=' ';}for(int k=0;k<=i;k++){str[j]='0'+k;str[j+1]=' ';j=j+2;}for(int k=i-1;k>=0;k--){str[j]='0'+k;str[j+1]=' ';j=j+2;}printf("%s\n",str);}for(i=n+1;i<=2*n;i++){int j=0;memset(str,0,1000);for(j=0;j<2*i-2*n;j++){str[j]=' ';}for(int k=0;k<=2*n-i;k++){str[j]='0'+k;str[j+1]=' ';j=j+2;}for(int k=2*n-i-1;k>=0;k--){str[j]='0'+k;str[j+1]=' ';j=j+2;}printf("%s\n",str);}return 0;
}
今年的第几天?
#include<iostream>
using namespace std;
void nextday(int &year,int &month,int &day){int dayofmonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31};if(year%400==0||year%4==0&&year%100!=0){dayofmonth[2]=29;}day++;if(day>dayofmonth[month]){day=1;month++;if(month>12){year++;month=1;}}
}
int main(){int y,m,d;while(scanf("%d %d %d",&y,&m,&d)!=EOF){int curm=1;int curd=1;int res=1;while(1){if(curm==m&&curd==d){printf("%d\n",res);break;}nextday(y,curm,curd);res++;}}return 0;
}
vector
完数VS盈数
#include<iostream>
#include<vector>
using namespace std;
int Sum(int n){int res=0;for(int i=1;i<n;i++){if(n%i==0){res+=i;}}return res;
}
int main(){vector<int> Evec;vector<int> Gvec;for(int n=2;n<=60;n++){if(Sum(n)==n){Evec.push_back(n);}else if(Sum(n)>n){Gvec.push_back(n);}}vector<int>::iterator it;printf("E:");for(it=Evec.begin();it!=Evec.end();it++){printf(" %d",*it);}printf("\n");printf("G:");for(it=Gvec.begin();it!=Gvec.end();it++){printf(" %d",*it);}printf("\n");return 0;
}
剩下的树
#include<iostream>
#include<vector>
using namespace std;
int main(){int L,M;scanf("%d%d",&L,&M);vector<int> road(L+1);for(int i=0;i<M;i++){int left,right;scanf("%d%d",&left,&right);for(int j=left;j<=right;j++){road[j]=1;}}vector<int>::iterator it;int res=0;for(it=road.begin();it!=road.end();++it){if(*it==0)res++;}printf("%d",res);return 0;
}
排序和查找
顺序查找
找x
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){int n;while(scanf("%d",&n)!=EOF){vector<int> vec(n);for(int i=0;i<n;i++){scanf("%d",&vec[i]);}int x;scanf("%d",&x);vector<int>::iterator it;it=find(vec.begin(),vec.end(),x);if(it==vec.end())printf("-1\n");else printf("%d\n",it-vec.begin());}return 0;
}
二分查找
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int main(){int n,m;while(scanf("%d",&n)!=EOF){vector<int> a(n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}map<int,int> findA;for(int i=0;i<n;i++){findA.insert({a[i],i});}scanf("%d",&m);int b;for(int i=0;i<m;i++){scanf("%d",&b);if(findA.find(b)==findA.end()){printf("NO\n");}else{printf("YES\n");}}}return 0;
}
找位置
#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main(){char str[200]={0};scanf("%s",str);map<char,vector<int>> timesMap;vector<char> charSeq;for(int i=0;str[i]!='\0';i++){timesMap[str[i]].push_back(i);if(timesMap[str[i]].size()==1){charSeq.push_back(str[i]);}}vector<char>::iterator it;for(it=charSeq.begin();it!=charSeq.end();it++){if(timesMap[*it].size()>1){vector<int>::iterator mapit=timesMap[*it].begin();printf("%c:%d",*it,*mapit);for(mapit=timesMap[*it].begin()+1;mapit!=timesMap[*it].end();++mapit){printf(",%c:%d",*it,*mapit);}printf("\n");}}return 0;
}
字符串
统计单词
#include<iostream>
#include<map>
#include<vector>using namespace std;
int main(){char arr[200]={0};fgets(arr,200,stdin);vector<int> wordCount={0};bool isSpace=true;int i=0;while(true){if(arr[i]=='.')break;else if(arr[i]==' ')isSpace=true;else{if(isSpace){wordCount.push_back(0);}wordCount[wordCount.size()-1]++;isSpace=false;}i++;}vector<int>::iterator it;for(it=wordCount.begin()+1;it!=wordCount.end();it++){printf("%d ",*it);}return 0;
}
浮点数加法
#include <iostream>
#include<string>
using namespace std;string getInt(string a){return a.substr(0,a.find('.'));
}
string getFraction(string b){return b.substr(b.find('.')+1,b.size()-b.find('.'));
}void FractionPlus(string &s,int &carry,string a,string b){int size=max(a.size(),b.size());while(size>a.size()){a.push_back('0');}while(size>b.size()){b.push_back('0');}s.resize(size);carry=0;for(int i=size-1;i>=0;i--){if(a[i]+b[i]+carry-'0'>'9'){s[i]=a[i]+b[i]+carry-'0'-10;carry=1;}else{s[i]=a[i]+b[i]+carry-'0'; carry=0;}}
}void IntPlus(string &s,int &carry,string a,string b){s.clear();for(int i=a.size()-1,j=b.size()-1;i>=0||j>=0||carry==1;i--,j--){if(i>=0&&j>=0){if(a[i]+b[j]+carry-'0'>'9'){s.insert(s.begin(),a[i]+b[j]+carry-'0'-10);carry=1;}else{s.insert(s.begin(),a[i]+b[j]+carry-'0');carry=0;}}else if(i>=0&&j<0){if(a[i]+carry>'9'){s.insert(s.begin(),a[i]+carry-10);carry=1;}else{s.insert(s.begin(),a[i]+carry);carry=0;}}else if(i<0&&j>=0){if(b[j]+carry>'9'){s.insert(s.begin(),b[j]+carry-10);carry=1;}else{s.insert(s.begin(),b[j]+carry);carry=0;}}else{s.insert(s.begin(),'1');carry=0;}}
}int main() {char arra[1000]={0};char arrb[1000]={0};while(scanf("%s%s",arra,arrb)!=EOF){string a=arra;string b=arrb;string ia=getInt(a);string ib=getInt(b);string fa=getFraction(a);string fb=getFraction(b);string fs;string is;int carry;FractionPlus(fs,carry,fa,fb);IntPlus(is,carry,ia,ib);printf("%s.%s\n",is.c_str(),fs.c_str());}return 0;
}
线性数据结构
队列
约瑟夫问题(队列)
#include<iostream>
#include<queue>
using namespace std;
int main(){queue<int> myQueue;int n,p,m;while(1){scanf("%d%d%d",&n,&p,&m);if(n==0&&p==0&&m==0){break;}int no=p;for(int i=0;i<n;i++){myQueue.push(no);++no;if(no>n){no=1;}}int say=1;while(1){int cur=myQueue.front();myQueue.pop();if(say==m){say=1;if(myQueue.empty()){printf("%d\n",cur);break;}else{printf("%d,",cur);}}else{++say;myQueue.push(cur);}}}return 0;
}
计算表达式(栈)
#include<iostream>
#include<map>
#include<stack>
#include<string>using namespace std;int main(){map<char,int> priority={{'\0',0},{'+',1},{'-',1},{'*',2},{'/',2}};char arr[1000]={0};while(scanf("%s",arr)!=EOF){stack<double> numStack;stack<char> opStack;string str="";for(int i=0;;i++){if(arr[i]>='0'&&arr[i]<='9'){str.push_back(arr[i]);}else{double num=stod(str);numStack.push(num);str="";while(!opStack.empty()&&priority[arr[i]]<=priority[opStack.top()]){double rhs=numStack.top();numStack.pop();double lhs=numStack.top();numStack.pop();char curOp=opStack.top();if(curOp=='+'){numStack.push(lhs+rhs);}else if(curOp=='-'){numStack.push(lhs-rhs);}else if(curOp=='*'){numStack.push(lhs*rhs);}else if(curOp=='/'){numStack.push(lhs/rhs);}opStack.pop();}if(arr[i]=='\0'){printf("%d\n",(int)numStack.top());break;}else{opStack.push(arr[i]); }}}}return 0;
}
递归和分治
跳台阶
#include<iostream>
#include<string.h>
using namespace std;
int f(int n){if(n==1){return 1;}else if(n==2){return 2;}else{return f(n-1)+f(n-2);}
}
int main(){int n;scanf("%d",&n);printf("%d\n",f(n));return 0;
}
不连续1的子串
#include<iostream>
#include<string.h>
using namespace std;
int f0(int n);
int f1(int n);
int f0(int n){if(n==1){return 1;}else{return f0(n-1)+f1(n-1);}
}
int f1(int n){if(n==1){return 1;}else {return f0(n-1);}
}
int main(){int n;scanf("%d",&n);printf("%d\n",f0(n)+f1(n));}
2的幂次方
#include<iostream>
#include<vector>
#include<string>
using namespace std;
string Get2sExponet(int n){vector<int> exp;if(n==0){return "0";}for(int i=15;i>=0;i--){if((n&(1<<i))!=0){exp.push_back(i);}}string res="";for(int i=0;i<exp.size();i++){if(i!=0){res+="+";}if(exp[i]==1){res+="2";}else{res+="2("+Get2sExponet(exp[i])+")";}}return res;
};
int main(){int n;while(scanf("%d",&n)!=EOF){printf("%s\n",Get2sExponet(n).c_str());};return 0;
}
树
二叉树
#include<iostream>
using namespace std;
int main(){int m,n;while(scanf("%d %d",&m,&n)!=EOF){if(m==0&&n==0)break;int treeNum=0;int right=m;int left=m;int begin;int final;for(int i=1;;i++){if(m>=1<<(i-1)&&m<1<<i){begin=i;}if(n>=1<<(i-1)&&n<1<<i){final=i;break;}}for(int i=begin;i<final;i++){left=left*2;right=right*2+1;}if(left>n){treeNum=(1<<(final-begin))-1;}else if(right>=n){treeNum=(1<<(final-begin))-1;treeNum+=n-left+1;}else{treeNum=(1<<(final-begin+1))-1;}printf("%d\n",treeNum);}return 0;
}
层序建树
#include<iostream>
#include<queue>
using namespace std;
struct TreeNode{char data;TreeNode* left;TreeNode* right;
};
struct QueueNode{TreeNode* parent;bool isLeft;
};
void BuildTree(TreeNode*& proot,queue<QueueNode*>& pos,char data){if(data!='#'){TreeNode* pNew=new TreeNode; pNew->data=data;QueueNode* pQueueNode=new QueueNode;pQueueNode->parent=pNew;pQueueNode->isLeft=false;pos.push(pQueueNode);if(proot==NULL){proot=pNew;}else{QueueNode* pCur=pos.front();if(pCur->isLeft==false){pCur->parent->left=pNew;pCur->isLeft=true;}else{pCur->parent->right=pNew;pos.pop();delete pCur;}}}else{if(proot!=NULL){QueueNode* pCur=pos.front();if(pCur->isLeft==false){pCur->parent->left=NULL;pCur->isLeft=true;}else{pCur->parent->right=NULL;pos.pop();delete pCur; }}}}
int main(){TreeNode* proot=NULL;char data;queue<QueueNode*> pos;while(1){scanf("%c",&data);if(data=='\n'){break;}BuildTree(proot,pos,data);}return 0;
}
层序遍历
void levelOrder(TreeNode* proot){queue<TreeNode*> pos;pos.push(proot);while(!pos.empty()){TreeNode* pCur=pos.front();pos.pop();printf("%c",pCur->data);if(pCur->left!=NULL){pos.push(pCur->left);}if(pCur->right!=NULL){pos.push(pCur->right);}}printf("\n");
}
先序遍历
void PreOrder(TreeNode* proot){if(proot==NULL){return;}else{printf("%c",proot->data);PreOrder(proot->left);PreOrder(proot->right);}
}
void InOrder(TreeNode* proot){if(proot==NULL){return;}else{InOrder(proot->left);printf("%c",proot->data);InOrder(proot->right);}
}//中序
void PostOrder(TreeNode* proot){if(proot==NULL){return;}else{PostOrder(proot->left);PostOrder(proot->right);printf("%c",proot->data);}
}//后序
二叉树最短路径长度
#include<iostream>
#include<vector>
using namespace std;
struct TreeNode{int num;TreeNode* left;TreeNode* right;TreeNode* parent;
};
int main(){int t;scanf("%d",&t);for(int i=0;i<t;i++){int n,m;scanf("%d%d",&n,&m);vector<TreeNode*> nodeArr(n+1);for(int j=1;j<=n;j++){nodeArr[j]=new TreeNode;nodeArr[j]->num=j;}nodeArr[1]->parent=NULL;for(int j=1;j<=n;j++){int left,right;scanf("%d%d",&left,&right);if(left!=-1){nodeArr[j]->left=nodeArr[left];nodeArr[left]->parent=nodeArr[j];}else{nodeArr[j]->left=NULL;}if(right!=-1){nodeArr[j]->right=nodeArr[right];nodeArr[right]->parent=nodeArr[j];}else{nodeArr[j]->right=NULL;}}int lhs,rhs;for(int j=0;j<m;j++){scanf("%d%d",&lhs,&rhs);vector<int> lvec;TreeNode* p=nodeArr[lhs];while(p!=NULL){lvec.push_back(p->num);p=p->parent;}vector<int> rvec;p=nodeArr[rhs];while(p!=NULL){rvec.push_back(p->num);p=p->parent;}int l=lvec.size()-1;int r=rvec.size()-1;while(true){if(l<0||r<0||lvec[l]!=rvec[r]){break;}l--;r--;}printf("%d\n",l+r+2);}}
}
二叉树遍历
#include<iostream>
using namespace std;
struct TreeNode
{char data;TreeNode* left;TreeNode* right;
};
TreeNode* BuildTree(int &i,char str[]){char c=str[i];i++;if(c=='#'){return NULL;}else{TreeNode* pNew=new TreeNode;pNew->data=c;pNew->left=BuildTree(i,str);pNew->right=BuildTree(i,str);return pNew;}
}
void InOrder(TreeNode*& proot){if(proot==NULL){return;}InOrder(proot->left);printf("%c ",proot->data);InOrder(proot->right);return;
}int main(){char str[1000]={0};while(scanf("%s",str)!=EOF){int i=0;TreeNode* res=BuildTree(i,str);InOrder(res);printf("\n");}return 0;
}
重建二叉树
#include<iostream>
#include<string>
using namespace std;
struct TreeNode{char data;TreeNode* left;TreeNode* right;
};
TreeNode* Rebuild(string preorder,string inorder){if(preorder.size()==0){return NULL;}else{TreeNode* pNew=new TreeNode;char rootdata=preorder[0];pNew->data=rootdata;int pos=inorder.find(rootdata);pNew->left=Rebuild(preorder.substr(1,pos),inorder.substr(0,pos));pNew->right=Rebuild(preorder.substr(pos+1),inorder.substr(pos+1));return pNew;}
}
void PostOrder(TreeNode* proot){if(proot==NULL){return;}PostOrder(proot->left);PostOrder(proot->right);printf("%c",proot->data);
}
int main(){char preorder[30];char inorder[30];while(scanf("%s%s",preorder,inorder)!=EOF){TreeNode* res=new TreeNode;res=Rebuild(preorder,inorder);PostOrder(res);printf("\n");}return 0;
}
二叉排序树
#include<iostream>
#include<string>
using namespace std;
struct TreeNode{int data;TreeNode* left;TreeNode* right;
};
void insertBST(TreeNode*& proot,int m){TreeNode* pNew=new TreeNode;pNew->data=m;pNew->left=NULL;pNew->right=NULL;if(proot==NULL){proot=pNew;printf("-1\n");}else{TreeNode* pCur=proot;TreeNode* pPre;while(1){if(pCur->data>m){pPre=pCur;pCur=pCur->left;if(pCur==NULL){pPre->left=pNew;printf("%d\n",pPre->data);break;}}else{pPre=pCur;pCur=pCur->right;if(pCur==NULL){pPre->right=pNew;printf("%d\n",pPre->data);break;}}}}
}int main(){int n;TreeNode* proot=NULL;scanf("%d",&n);for(int i=0;i<n;i++){int m;scanf("%d",&m);insertBST(proot,m);}return 0;
}
二叉搜索树
#include<iostream>
#include<string>
using namespace std;
struct TreeNode{char data;TreeNode* left;TreeNode* right;
};
void insertBST(TreeNode*& proot,char m){TreeNode* pNew=new TreeNode;pNew->data=m;pNew->left=NULL;pNew->right=NULL;if(proot==NULL){proot=pNew;}else{TreeNode* pCur=proot;TreeNode* pPre;while(1){if(pCur->data>m){pPre=pCur;pCur=pCur->left;if(pCur==NULL){pPre->left=pNew;break;}}else{pPre=pCur;pCur=pCur->right;if(pCur==NULL){pPre->right=pNew;break;}}}}
}
string preOrder(TreeNode* proot){if(proot==NULL){return "";}else{return proot->data+preOrder(proot->left)+preOrder(proot->right);}
}
string InOrder(TreeNode* proot){if(proot==NULL){return "";}else{return InOrder(proot->left)+proot->data+InOrder(proot->right);}
}int main(){int n;TreeNode* proot=NULL;scanf("%d",&n);char arr[21]={0};scanf("%s",arr);for(int i=0;arr[i]!='\0';i++){insertBST(proot,arr[i]);}string preorder=preOrder(proot);string inorder=InOrder(proot);for(int i=0;i<n;i++){char tmp[21]={0};TreeNode* pos=NULL;scanf("%s",tmp);for(int i=0;tmp[i]!='\0';i++){insertBST(pos,tmp[i]);}if(preOrder(pos)==preorder&&inorder==InOrder(pos)){printf("YES\n");}else{printf("NO\n");}}return 0;
}
优先队列
复数集合
#include<iostream>
#include<string>
#include<queue>
using namespace std;
struct Complex{int re;int im;Complex(int _re,int _im){re=_re;im=_im;}
};
bool operator < (Complex lhs,Complex rhs){return lhs.re*lhs.re+lhs.im*lhs.im<rhs.re*rhs.re+rhs.im*rhs.im||(lhs.re*lhs.re+lhs.im*lhs.im==rhs.re*rhs.re+rhs.im*rhs.im)&&(lhs.im>rhs.im);
}
int main(){int n;scanf("%d",&n);priority_queue<Complex> myq;for(int i=0;i<n;i++){char arr[10]={0};scanf("%s",arr);string str=arr;if(str=="Pop"){if(myq.empty()){printf("empty\n");}else{printf("%d+i%d\n",myq.top().re,myq.top().im);myq.pop();printf("SIZE = %d\n",myq.size());}}else{int re,im;scanf("%d+i%d",&re,&im);myq.push(Complex(re,im));printf("SIZE = %d\n",myq.size());}}return 0;
}
哈夫曼树
#include<iostream>
#include<queue>
using namespace std;
int main(){int n;while(scanf("%d",&n)!=EOF){priority_queue<int> myq;for(int i=0;i<n;i++){int m;scanf("%d",&m);myq.push(-1*m);}int res=0;while(myq.size()>=2){int l1,l2;l1=myq.top();myq.pop();l2=myq.top();myq.pop();res+=l1+l2;myq.push(l1+l2);}printf("%d\n",-1*res);}return 0;
}
搜索
树的高度
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main(){int n,m;scanf("%d%d",&n,&m);vector<vector<int>> tree(n+1);for(int i=0;i<n-1;i++){int u,v;scanf("%d%d",&u,&v);tree[u].push_back(v);tree[v].push_back(u);}queue<int> toVisit;toVisit.push(m);vector<int> distance(n+1);for(int i=1;i<n;i++){distance[i]=-1;}distance[m]=0;int maxdist=0;while(!toVisit.empty()){int current=toVisit.front();toVisit.pop();for(int i=0;i<tree[current].size();i++){int child=tree[current][i];if(distance[child]!=-1){continue;}toVisit.push(child);distance[child]=distance[current]+1;maxdist=distance[child];}}printf("%d\n",maxdist);return 0;
}
玛雅人的密码
#include<iostream>
#include<string>
#include<queue>
#include<unordered_map>
using namespace std;
int main(){int n;scanf("%d",&n);char arr[20]={0};scanf("%s",arr);string str=arr;if(n<4){printf("-1\n");return 0;}queue<string> toVisit;toVisit.push(str);unordered_map<string,int> distance;distance.insert({str,0});while(!toVisit.empty()){string current=toVisit.front();toVisit.pop();if(current.find("2012")!=string::npos){printf("%d\n",distance[current]);return 0;}for(int i=0;i<n-1;i++){string exc=current;char tmp=exc[i];exc[i]=exc[i+1];exc[i+1]=tmp;if(distance.count(exc)==0){toVisit.push(exc);distance.insert({exc,distance[current]+1});}}}printf("-1\n");return 0;
}
八皇后
打表取巧
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<vector<int>> QueenVec;
void DFSFindQueen(vector<int>& queen,int pos){for(int i=1;i<=8;i++){bool isOK=true;for(int j=0;j<pos;j++){if(queen[j]==i||pos-j==queen[j]-i||pos-j==i-queen[j]){isOK=false;break;}}if(isOK==true){queen.push_back(i);if(pos==7){QueenVec.push_back(queen);printf("\"");for(int k=0;k<8;k++){printf("%d",queen[k]);}printf("\",\n");}else{DFSFindQueen(queen,pos+1);}queen.pop_back();}}
}
vector<string> queentable={"15863724",
"16837425",
"17468253",
"17582463",
"24683175",
………………
"73825164",
"74258136",
"74286135",
"75316824",
"82417536",
"82531746",
"83162574",
"84136275"
};
int main(){//vector<int>queen;//DFSFindQueen(queen,0);int n;while(scanf("%d",&n)!=EOF){printf("%s\n",queentable[n-1].c_str());}return 0;
}
数组划分
剪枝
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int sum=0;
int diff=0;
bool exitFlag=false;//记录是否提前退出
void DFSFindMinDiff(vector<int> &arr,int pos,int sa){if(pos==arr.size()||exitFlag){return;}//arr[pos]放入a集合中int newdiff;if(2*(sa+arr[pos])-sum>0){newdiff=2*(sa+arr[pos])-sum;}else{newdiff=sum-2*(sa+arr[pos]);}if(newdiff<diff){diff=newdiff;if(diff==0||diff==1||2*arr[pos]>sum){exitFlag=true;}}if(2*(sa+arr[pos])-sum<0){DFSFindMinDiff(arr,pos+1,sa+arr[pos]);}//arr[pos]不放入a集合中DFSFindMinDiff(arr,pos+1,sa);
}
bool compare(int lhs,int rhs){return lhs>rhs;
}
int main(){vector<int> arr;int i;while(scanf("%d",&i)!=EOF){arr.push_back(i);}for(int i=0;i<arr.size();i++){sum+=arr[i];}diff=sum;sort(arr.begin(),arr.end(),compare);DFSFindMinDiff(arr,0,0);int sa=(sum-diff)/2;int sb=sa+diff;printf("%d %d\n",sb,sa);return 0;
}
图
图的构建:邻接表
#include<iostream>
#include<vector>
using namespace std;
//A-B A-C A-D C-D
int main(){//A-0 B-1 C-2 D-3vector<int> graph[4];int u,v;u=0,v=1;graph[u].push_back(v);graph[v].push_back(u);u=0,v=2;graph[u].push_back(v);graph[v].push_back(u);u=0,v=3;graph[u].push_back(v);graph[v].push_back(u);u=2,v=3;graph[u].push_back(v);graph[v].push_back(u);return 0;
}
并查集
#include<iostream>
#include<vector>
using namespace std;
int father[1000];
void InitDisjointSet(int n){for(int i=0;i<n;i++){father[i]=i;}
}
int FindDisjointSet(int u){if(u==father[u]){return u;}else{father[u]=FindDisjointSet(father[u]);return father[u];}
}
void UnionDisjointSet(int u,int v){int uroot=FindDisjointSet(u);int vroot=FindDisjointSet(v);father[vroot]=uroot;
}
int main(){//1234//567//08int n=9;InitDisjointSet(n);UnionDisjointSet(1,2);UnionDisjointSet(1,3);UnionDisjointSet(1,4);UnionDisjointSet(5,6);UnionDisjointSet(5,7);UnionDisjointSet(0,8);for(int i=0;i<9;i++){printf("NO=%d,root=%d\n",i,FindDisjointSet(i));}return 0;
}
畅通工程
#include<iostream>
#include<vector>
using namespace std;
int father[1000];
void InitDisjointSet(int n){for(int i=1;i<=n;i++){father[i]=i;}
}
int FindDisjointSet(int u){if(u==father[u]){return u;}else{father[u]=FindDisjointSet(father[u]);return father[u];}
}
int setCount;
void UnionDisjointSet(int u,int v){int uroot=FindDisjointSet(u);int vroot=FindDisjointSet(v);if(uroot!=vroot){setCount--;}father[vroot]=uroot;
}
int main(){int n;while(scanf("%d",&n)!=EOF){if(n==0)return 0;setCount=n;InitDisjointSet(n);int m;scanf("%d",&m);for(int i=0;i<m;i++){int u,v;scanf("%d%d",&u,&v);UnionDisjointSet(u,v);}printf("%d\n",setCount-1);}return 0;
}
这是一棵树吗
#include<iostream>
#include<vector>
using namespace std;
int father[10001];
void InitDisjointSet(int n){for(int i=1;i<=n;i++){father[i]=i;}
}
int FindDisjointSet(int u){if(u==father[u]){return u;}else{father[u]=FindDisjointSet(father[u]);return father[u];}
}
void UnionDisjointSet(int u,int v){int uroot=FindDisjointSet(u);int vroot=FindDisjointSet(v);father[vroot]=uroot;
}
int main(){int u,v;InitDisjointSet(10001);int edgeCount=0;int vertexCount=0;vector<int> vertex(10001);vector<int> inDegree(10001);bool isOK=true;int CaseIdx=1;while(1){scanf("%d%d",&u,&v);if(u==-1&&v==-1){break;}else if(u==0&&v==0){if(vertexCount!=edgeCount+1){isOK=false;}if(vertexCount==0&&edgeCount==0){isOK=true;}if(isOK){printf("Case %d is a tree.\n",CaseIdx);}else{printf("Case %d is not a tree.\n",CaseIdx);}InitDisjointSet(10001);edgeCount=0;vertexCount=0;for(int i=0;i<10001;i++){vertex[i]=0;inDegree[i]=0;}isOK=true;CaseIdx++;}else{++edgeCount;if(vertex[u]==0){vertex[u]=1;++vertexCount;}if(vertex[v]==0){vertex[v]=1;++vertexCount;}if(FindDisjointSet(u)==FindDisjointSet(v)){isOK=false;}else{UnionDisjointSet(u,v);}++inDegree[v];if(inDegree[v]>=2){isOK=false;}}}return 0;
}
最小生成树 kruskal
还是畅通工程
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Edge{int from;int to;int weight;Edge(int _from,int _to,int _weight){from=_from;to=_to;weight=_weight;}
};
int father[101];
void InitDisjointSet(int n){for(int i=1;i<=n;i++){father[i]=i;}
}
int FindDisjointSet(int u){if(u==father[u]){return u;}else{father[u]=FindDisjointSet(father[u]);return father[u];}
}
void UnionDisjointSet(int u,int v){int uroot=FindDisjointSet(u);int vroot=FindDisjointSet(v);father[vroot]=uroot;
}
bool compare(Edge lhs,Edge rhs){return lhs.weight<rhs.weight;
}
int main(){int n;while(scanf("%d",&n)!=EOF){if(n==0)return 0;InitDisjointSet(n);int edgeCount=0;int sumweight=0;vector<Edge> edgeVec;for(int i=0;i<n*(n-1)/2;i++){int from,to,weight;scanf("%d%d%d",&from,&to,&weight);Edge e(from,to,weight);edgeVec.push_back(e);}sort(edgeVec.begin(),edgeVec.end(),compare);for(int i=0;i<edgeVec.size();i++){if(FindDisjointSet(edgeVec[i].from)!=FindDisjointSet(edgeVec[i].to)){UnionDisjointSet(edgeVec[i].from,edgeVec[i].to);edgeCount++;sumweight+=edgeVec[i].weight;}if(edgeCount==n-1){break;}}printf("%d\n",sumweight);}return 0;
}
单源最短路径 dijkstra
畅通工程续
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct Edge
{int u;int v;int weight;Edge(int _u,int _v,int _weight){u=_u;v=_v;weight=_weight;}
};
vector<Edge> graph[300];
struct pQueueNode{int u;int distance;pQueueNode(int _u,int _distance){u=_u;distance=_distance;}
};
bool operator < (pQueueNode lhs,pQueueNode rhs){return lhs.distance>rhs.distance;
}
int Dijkstra(int s, int t){priority_queue<pQueueNode> pqueue;int distance[300];bool isVisited[300];for(int i=0;i<300;i++){distance[i]=-1;isVisited[i]=false;}distance[s]=0;pQueueNode qnode(s,0);pqueue.push(qnode);while(!pqueue.empty()){int u=pqueue.top().u;pqueue.pop();if(isVisited[u]==true){continue;}isVisited[u]=true;for(int i=0;i<graph[u].size();i++){int v=graph[u][i].v;int weight=graph[u][i].weight;if(distance[v]==-1||distance[v]>distance[u]+weight){distance[v]=distance[u]+weight;pQueueNode next(v,distance[v]);pqueue.push(next);}}}return distance[t];
}
int main(){int n,m;while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++){graph[i].clear();}for(int i=0;i<m;i++){int u,v,weight;scanf("%d%d%d",&u,&v,&weight);Edge e1(u,v,weight);graph[u].push_back(e1);Edge e2(v,u,weight);graph[v].push_back(e2);}int s,t;scanf("%d%d",&s,&t);printf("%d\n",Dijkstra(s,t));}return 0;
}
动态规划
跳台阶
#include<iostream>
using namespace std;
int main(){int dp[16]={0};dp[1]=1;dp[2]=2;int n;scanf("%d",&n);for(int i=3;i<n;i++){dp[i]=dp[i-1]+dp[i-2];}printf("%d\n",dp[n]);return 0;
}
放苹果
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){int dp[13][13]={0};int m,n;while(scanf("%d%d",&m,&n)!=EOF){memset(dp,0,13*13);for(int i=0;i<=m;i++){dp[i][1]=1;}for(int j=1;j<=n;j++){dp[1][j]=1;dp[0][j]=1;}for(int i=2;i<=m;i++){for(int j=2;j<=n;j++){if(i>=j){dp[i][j]=dp[i][j-1]+dp[i-j][j];}else{dp[i][j]=dp[i][i];}}}printf("%d\n",dp[m][n]);}return 0;
}
最长公共子序列
int dp[1002][1002];//全局变量才不会栈溢出
int longestCommonSubsequence(string text1, string text2) {int m=text1.size();int n=text2.size();for(int i=0;i<=m;i++){dp[i][0]=0;}for(int i=0;i<=n;i++){dp[0][i]=0;}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(text1[i-1]==text2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}}return dp[m][n];
}
最长公共子串
#include<iostream>
#include<stdio.h>
using namespace std;
short dp[10002][10002];
int main(){char s1[10001];char s2[10001];scanf("%s%s",s1,s2);int n=strlen(s1);int m=strlen(s2);for(int j=0;j<=m;j++){dp[0][j]=0;}for(int i=0;i<=n;i++){dp[i][0]=0;}short curmax=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s1[i-1]>='a'&&s1[i-1]<='z'&&s1[i-1]==s2[j-1]){dp[i][j]=dp[i-1][j-1]+1;curmax=max(dp[i][j],curmax);}else{dp[i][j]=0;}}}printf("%d\n",curmax);return 0;
}
最大序列和
#include<iostream>
#include<stdio.h>
using namespace std;
long long s[1000001];
long long dp[1000002];
int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%lld",&s[i]);}dp[1]=s[0];long long curmax=dp[1];for(int i=2;i<=n;i++){if(dp[i-1]<=0){dp[i]=s[i-1];}else{dp[i]=s[i-1]+dp[i-1];}curmax=max(dp[i],curmax);}printf("%lld\n",curmax);return 0;
}
背包问题
点菜问题
#include<iostream>
#include<stdio.h>
using namespace std;int main(){int c,n;scanf("%d%d",&c,&n);int p[101];int v[101];int dp[1002][102];for(int i=0;i<n;i++){scanf("%d%d",&p[i],&v[i]);}for(int i=0;i<=c;i++){dp[i][0]=0;}for(int i=0;i<=n;i++){dp[0][i]=0;}for(int i=1;i<=c;i++){for(int j=1;j<=n;j++){if(i-p[j-1]<0){dp[i][j]=dp[i][j-1];}else{dp[i][j]=max(dp[i-p[j-1]][j-1]+v[j-1],dp[i][j-1]);}}}printf("%d\n",dp[c][n]);return 0;
}
铺瓷砖
#include<iostream>
using namespace std;
int main(){int t;scanf("%d",&t);for(int i=0;i<t;i++){int n;scanf("%d",&n);int dp[32][5]={0};int dp_one[32][5]={0};dp[0][0]=1;for(int i=1;i<=n;i++){for(int j=1;j<=3;j++){if(i-j>=0){for(int k=0;k<=3;k++){if(k!=j){dp[i][j]+=dp[i-j][k];dp_one[i][j]+=dp_one[i-j][k];}}if(j==1){dp_one[i][j]+=dp[i][j];}}}}printf("%d\n",dp[n][1]+dp[n][2]+dp[n][3]);printf("%d\n",dp_one[n][1]+dp_one[n][2]+dp_one[n][3]);}return 0;
}
数学问题
二进制数
#include<iostream>
#include<vector>
using namespace std;int main(){unsigned int u;while(scanf("%u",&u)!=EOF){if(u==0){printf("0\n");return 0;}vector<int> binVec;while(u>0){binVec.push_back(u%2);u/=2;}for(int i=binVec.size()-1;i>=0;i--){printf("%d",binVec[i]);}printf("\n");}return 0;
}
质数
埃氏筛法(打表)
#include<iostream>
#include<vector>
using namespace std;
int main(){vector<int> num(10001);for(int i=2;i<=10000;i++){if(num[i]==0){printf("%d,\n",i);}for(int j=2*i;j<=10000;j+=i){num[j]=1;}}return 0;
}
质数(每100里至少有一个整数)
#include<iostream>
#include<vector>
using namespace std;
int prime[]={2,
3,
5,
7,
11,
13,
17,
.......
9931,
9941,
9949,
9967,
9973
};
int main(){int t,x;scanf("%d",&t);for(int i=0;i<t;i++){scanf("%d",&x); for(int j=0;j<1229;j++){//10*x+1~10*x+9if(prime[j]>=10*x+1&&prime[j]<=10*x+9){printf("%d\n",prime[j]);break;}//100*x+10~100*x+99if(prime[j]>=100*x+10&&prime[j]<=100*x+99){printf("%d\n",prime[j]);break;}}}return 0;
}
快速幂
递推数列
#include<iostream>
using namespace std;
void MatrixMutiply(int m1[2][2],int m2[2][2],int res[2][2]){res[0][0]=m1[0][0]*m2[0][0]%10000+m1[0][1]*m2[1][0]%10000;res[0][0]%=10000;res[0][1]=m1[0][0]*m2[0][1]%10000+m1[0][1]*m2[1][1]%10000;res[0][1]%=10000;res[1][0]=m1[1][0]*m2[0][0]%10000+m1[1][1]*m2[1][0]%10000;res[1][0]%=10000;res[1][1]=m1[1][0]*m2[0][1]%10000+m1[1][1]*m2[1][1]%10000;res[1][1]%=10000;
}
void MatrixPower(int m1[2][2],int n,int res[2][2]){if(n==0){res[0][0]=1;res[0][1]=0;res[1][0]=0;res[1][1]=1;}else if(n%2==0){int temp[2][2];MatrixPower(m1,n/2,temp);MatrixMutiply(temp,temp,res);}else{int temp1[2][2];MatrixPower(m1,n/2,temp1);int temp2[2][2];MatrixMutiply(temp1,temp1,temp2);MatrixMutiply(temp2,m1,res);}
}
int main(){int matrix[2][2];matrix[1][0]=1;matrix[1][1]=0;int a0,a1,p,q,k;scanf("%d%d%d%d%d",&a0,&a1,&p,&q,&k);matrix[0][0]=p;matrix[0][1]=q;int res[2][2];MatrixPower(matrix,k-1,res);printf("%d\n",(res[0][0]*a1%10000+res[0][1]*a0%10000)%10000);return 0;
}
相关文章:
算法复习笔记
算法复习 最大公约数枚举abc反序数 模拟xxx定律打印数字菱形今年的第几天?vector完数VS盈数剩下的树 排序和查找顺序查找二分查找找位置 字符串统计单词浮点数加法 线性数据结构队列约瑟夫问题(队列)计算表达式(栈) 递…...
spring boot 引入fastjson,com.alibaba.fastjson不存在(Springboot-测试项目)
spring boot 引入fastjson,com.alibaba.fastjson不存在(Springboot-测试项目) 先解决最初的的包不找到问题,适用所有包找不到跟进。 <mirrors><!-- mirror| Specifies a repository mirror site to use instead of a g…...
新闻推荐系统(springboot+vue+mysql)含万字文档+运行说明文档
新闻推荐系统(springbootvuemysql)含万字文档运行说明文档 该系统是一个新闻推荐系统,分为管理员和用户两个角色。管理员模块包括个人中心、用户管理、排行榜管理、新闻管理、我的收藏管理和系统管理等功能。管理员可以通过这些功能进行用户信息管理、查看和编辑用…...
UE4 踩坑记录
1、Using git status to determine working set for adaptive non-unity build 我删除了一个没用的资源,结果就报这个错,原因就是这条命令导致的, 如果这个项目是git项目, ue编译时会优先通过 git status检查哪些文件被修改&#…...
【解决方案】vscode 不小心打开了列选择模式,选择时只能选中同一列的数据。
vscode 不小心打开了列选择模式,选择时只能选中同一列的数据。 解决方案: 1.通过命令面板关闭: 按下 Ctrl Shift P(Windows/Linux)或 Cmd Shift P(macOS),输入 切换列选择模式…...
国标GB28181视频平台EasyCVR如何搭建汽车修理厂远程视频网络监控方案
一、背景分析 近年我国汽车保有量持续攀升,与之相伴的汽车保养维修需求也逐渐提高。随着社会经济的发展,消费者对汽车维修服务质量的要求越来越高,这使得汽车维修店的安全防范与人员管理问题面临着巨大挑战。 多数汽车维修店分布分散&#…...
【Go】windows下的Go安装与配置,并运行第一个Go程序
【Go】windows下的Go安装与配置,并运行第一个Go程序 安装环境:windows10 64位 安装版本:go1.16 windows/amd64 一、安装配置步骤 1.到官方网址下载安装包 https://golang.google.cn/dl/ 默认情况下 .msi 文件会安装在 c:\Go 目录下。可自行配…...
Linux 线程:从零构建多线程应用:系统化解析线程API与底层设计逻辑
线程 线程的概述 在之前,我们常把进程定义为 程序执行的实例,实际不然,进程实际上只是维护应用程序的各种资源,并不执行什么。真正执行具体任务的是线程。 那为什么之前直接执行a.out的时候,没有这种感受呢…...
榕壹云无人共享系统:基于SpringBoot+MySQL+UniApp的物联网共享解决方案
无人共享经济下的技术革新 随着无人值守经济模式的快速发展,传统共享设备面临管理成本高、效率低下等问题。榕壹云无人共享系统依托SpringBoot+MySQL+UniApp技术栈,结合物联网与移动互联网技术,为商家提供低成本、高可用的无人化运营解决方案。本文将详细解析该系统的技术架…...
技术书籍推荐(002):电子书免费下载
20. 利用Python进行数据分析 免费 电子书 PDF 下载 书籍简介: 本书聚焦于使用Python进行数据处理和分析。详细介绍了Python中用于数据分析的重要库,如NumPy(提供高效的数值计算功能,包括数组操作、数学函数等)、panda…...
安全序列(DP)
#include <bits/stdc.h> using namespace std; const int MOD1e97; const int N1e65; int f[N]; int main() {int n,k;cin>>n>>k;f[0]1;for(int i1;i<n;i){f[i]f[i-1]; // 不放桶:延续前一位的所有方案if(i-k-1>0){f[i](f[i]f[i-k…...
数据可视化 —— 堆形图应用(大全)
一、案例一:温度堆积图 # 导入 matplotlib 库中的 pyplot 模块,这个模块提供了类似于 MATLAB 的绘图接口, # 方便我们创建各种类型的可视化图表,比如折线图、柱状图、散点图等 import matplotlib.pyplot as plt # 导入 numpy 库&…...
利用 pyecharts 实现地图的数据可视化——第七次人口普查数据的2d、3d展示(关键词:2d 、3d 、map、 geo、涟漪点)
参考文档:链接: link_pyecharts 官方文档 1、map() 传入省份全称,date_pair 是列表套列表 [ [ ],[ ] … ] 2、geo() 传入省份简称,date_pair 是列表套元组 [ ( ),( ) … ] 1、准备数据 population_data:简称经纬度 population_da…...
字节跳动开源 LangManus:不止是 Manus 平替,更是下一代 AI 自动化引擎
当 “AI 自动化” 成为科技领域最炙手可热的关键词,我们仿佛置身于一场激动人心的变革前夜。各行各业都在翘首以盼,期待 AI 技术能够真正解放生产力,将人类从繁琐重复的工作中解脱出来。在这个充满无限可能的时代,字节跳动悄然发布…...
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题
文章目录 1 幸运数题目描述:答案:4430091 代码: 2 有奖问答题目描述:重点:答案:8335366 代码: 3 平方差题目描述:思路:数学找规律代码: 4 更小的数题目描述&a…...
springboot+tabula解析pdf中的表格数据
场景 在日常业务需求中,往往会遇到解析pdf数据获取文本的需求,常见的做法是使用 pdfbox 来做,但是它只适合做一些简单的段落文本解析,无法处理表格这种复杂类型,因为单元格中的文本有换行的情况,无法对应到…...
静态链接part1
比较多这一部分,包含了编译和链接,书还没看完就先记录一下其中编译的一部分 编译 gcc编译分为预处理、编译、汇编、链接四个步骤 预处理 也称预编译,主要处理的是源代码文件中以“#”开始的预编译指令,这里简单讲一下规则&…...
golang通过STMP协议发送邮件功能详细操作
一.简介 在 Go 语言中接入 IMAP 和 SMTP 服务来进行邮件的发送和接收操作,可以通过使用一些现有的第三方库来简化操作,常见的库有 go-imap 和 gomail,它们可以帮助我们连接和操作 IMAP 邮箱(读取邮件)以及通过 SMTP 发送邮件 二.实现 1. IMA…...
分布式锁在秒杀场景中的Python实现与CAP权衡
目录 一、分布式锁的前世今生 二、秒杀系统的 “硬核” 挑战 三、Python 实现分布式锁的 “实战演练” Redis 实现:快准狠 ZooKeeper 实现:稳如老狗 数据库实现:老实本分 四、CAP 理论的 “三角恋” 五、性能优化的 “锦囊妙计” 锁粒度控制:粗细有道 超时机制:别…...
数据驱动的温暖守护:智慧康养平台如何实现 “千人千面” 的精准照护?
在当今数字化时代,七彩喜智慧康养平台借助数据的力量,正逐步打破传统养老服务模式的局限,实现 “千人千面” 的精准照护。 通过收集、分析和利用大量与老年人相关的数据,这些平台能够深入了解每位老人的独特需求,并据…...
基于SSM的校园美食交流系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
多线程进阶
进阶的内容,就关于线程的面试题为主了,涉及到的内容在工作中使用较少,但面试会考!!! 锁的策略 加锁的过程中,在处理冲突的过程中,涉及到的一些不同的处理方法,此处的锁…...
聊一聊接口测试时遇到第三方服务时怎么办
目录 一、使用 Mock 或 Stub 模拟第三方服务 二、利用第三方服务的沙箱(Sandbox)环境 三、测试隔离与数据清理 四、处理异步回调 五、容错与异常测试 六、契约测试 在我们进行接口测试时,有的时候会遇到要调用第三方服务即外部的API&am…...
《Python星球日记》第22天:NumPy 基础
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、NumPy 简介1. 什么是 NumPy?为什么使用 NumPy?2. 安…...
Spring Boot 中 Bean 的生命周期详解
Spring Boot 中 Bean 的生命周期详解 一、引言 在 Spring Boot 应用中,Bean 是构成应用程序的基础组件。理解 Bean 的生命周期对于开发高效、稳定的 Spring Boot 应用至关重要。本文将深入探讨 Spring Boot 中 Bean 的完整生命周期过程。 二、Bean 生命周期的基本…...
结构化需求分析:功能、数据与行为的全景建模
目录 前言1 功能模型:数据流图(DFD)的结构与应用1.1 数据流图的基本构成要素1.2 数据流图的层次化设计1.3 数据流图的建模价值 2 数据模型:ER图揭示数据结构与关系2.1 ER图的基本组成2.2 建模过程与注意事项2.3 数据模型的价值体现…...
OpenCompass模型评估
OpenCompass面向大模型的开源方和使用者, 提供开源、高效、全面的大模型评测开放平台。 一、OpenCompass文档 1.基础安装 使用Conda准备 OpenCompass 运行环境: conda create --name opencompass python3.10 -y conda activate opencompass2. 安装 Op…...
基于51单片机语音实时采集系统
基于51单片机语音实时采集 (程序+原理图+PCB+设计报告) 功能介绍 具体功能: 系统由STC89C52单片机ISD4004录音芯片LM386功放模块小喇叭LCD1602按键指示灯电源构成 1.可通过按键随时选择相应的录音进行播…...
NeuroImage:膝关节炎如何影响大脑?静态与动态功能网络变化全解析
膝骨关节炎(KOA)是导致老年人活动受限和残疾的主要原因之一。这种疾病不仅引起关节疼痛,还会显著影响患者的生活质量。然而,目前对于KOA患者大脑功能网络的异常变化及其与临床症状之间的关系尚不清楚。 2024年4月10日,…...
高级java每日一道面试题-2025年4月01日-微服务篇[Nacos篇]-Nacos集群的数据一致性是如何保证的?
如果有遗漏,评论区告诉我进行补充 面试官: Nacos集群的数据一致性是如何保证的? 我回答: Nacos 集群数据一致性保障机制详解 在 Java 高级面试中,Nacos 集群的数据一致性保障是考察分布式系统核心能力的关键点。以下是 Nacos 通过多种机制和技术确保…...
阿里云 OSS 在 ZKmall开源商城的应用实践
ZKmall开源商城通过深度整合阿里云OSS(对象存储服务),构建了高效、安全的文件存储与管理体系,支撑商品图片、用户上传内容等非结构化数据的存储与分发。结合阿里云OSS的技术特性与ZKmall的微服务架构,其实践方案可总结…...
【Linux】线程池与封装线程
目录 一、线程池: 1、池化技术: 2、线程池优点: 3、线程池应用场景: 4、线程池实现: 二、封装线程: 三、单例模式: 四、其他锁: 五、读者写者问题 一、线程池: …...
protobuf的应用
1.版本和引用 syntax "proto3"; // proto2 package tutorial; // package类似C命名空间 // 可以引用本地的,也可以引用include里面的 import "google/protobuf/timestamp.proto"; // 已经写好的proto文件是可以引用 我们版本选择pr…...
linux shell编程之条件语句(二)
目录 一. 条件测试操作 1. 文件测试 2. 整数值比较 3. 字符串比较 4. 逻辑测试 二. if 条件语句 1. if 语句的结构 (1) 单分支 if 语句 (2) 双分支 if 语句 (3) 多分支 if 语句 2. if 语句应用示例 (1) 单分支 if 语句应用 (2) 双分支 if 语句应用 (3) 多分支 …...
图论整理复习
回溯: 模板: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯ÿ…...
企业指标设计方法指南
该文档聚焦企业指标设计方法,适用于企业中负责战略规划、业务运营、数据分析、指标管理等相关工作的人员,如企业高管、部门经理、数据分析师等。 主要内容围绕指标设计展开:首先指出指标设计面临的困境,包括权责不清、口径不统一、缺乏标准规范、报表体系混乱、指标…...
AIP-217 不可达资源
编号217原文链接AIP-217: Unreachable resources状态批准创建日期2019-08-26更新日期2019-08-26 有时,用户可能会请求一系列资源,而其中某些资源暂时不可用。最典型的场景是跨集合读。例如用户可能请求返回多个上级位置的资源,但其中某个位置…...
SAP系统控制检验批
问题:同一批物料多检验批问题 现象:同一物料多采购订单同一天到货时,对其采购订单分别收货,导致系统产生多个检验批,需分别请检单、检验报告等,使质量部工作复杂化。 原因:物料主数据质量试图设…...
JavaScript 代码混淆与反混淆技术详解
一、代码混淆:让别人看不懂你的代码 混淆技术就是一种“代码伪装术”,目的是让别人很难看懂你的代码逻辑,从而保护你的核心算法或敏感信息。 1. 变量名压缩 原理:把变量名改成乱码,比如把calculatePrice改成a&#…...
Android studio | From Zero To One ——手机弹幕
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 滚动显示 代码activity_main.xmlactivity_fullscreen.xmlAndroidManife…...
面向对象的需求分析与UML构造块详解
目录 前言1 面向对象的需求分析概述2 UML构造块概述3 UML事物详解3.1 结构事物(Structural Things)3.2 行为事物(Behavioral Things)3.3 分组事物(Grouping Things)3.4 解释事物(Annotational T…...
LeetCode 2843.统计对称整数的数目:字符串数字转换
【LetMeFly】2843.统计对称整数的数目:字符串数字转换 力扣题目链接:https://leetcode.cn/problems/count-symmetric-integers/ 给你两个正整数 low 和 high 。 对于一个由 2 * n 位数字组成的整数 x ,如果其前 n 位数字之和与后 n 位数字…...
RocketMQ深度百科全书式解析
一、核心架构与设计哲学 1. 设计目标 海量消息堆积:单机支持百万级消息堆积,适合大数据场景(如日志采集)。严格顺序性:通过队列分区(Queue)和消费锁机制保证局部顺序。事务…...
A2A与MCP Server:AI智能体协作与工具交互的核心协议对比
A2A与MCP Server:AI智能体协作与工具交互的核心协议对比 摘要 在AI智能体技术爆发式增长的今天,谷歌的A2A协议与Anthropic的MCP协议正在重塑AI系统架构。本文通过协议栈分层模型、企业级架构设计案例及开发者实践指南三大维度,揭示二者在AI生…...
如何将网页保存为pdf
要将网页保存为PDF,可以按照以下几种方法操作: 1. 使用浏览器的打印功能 大多数现代浏览器(如Chrome、Firefox、Edge等)都支持将网页保存为PDF文件。步骤如下: 在 Google Chrome 中: 打开你想保存为PDF…...
位运算与实战场景分析-Java代码版
一、为什么每个程序员都要掌握位运算? 在电商秒杀系统中,位运算可以快速判断库存状态;在权限管理系统里,位运算能用极小的空间存储复杂权限配置;在算法竞赛中,位运算更是高频出现的性能优化利器。这项看似…...
【“星睿O6”AI PC开发套件评测】+ Debian 系统安装及 sysbench 跑分对比
很荣幸这次可以得到机会评测 “星睿O6”AI PC开发套件。第一篇文章,我将分为两个部分: 官方 Debian 系统安装到 NVMEsysbench 跑分以及对比 RK3568 和 I712700KF 正文开始之前,忍不住还是想放几张开箱照片,板子实在是太精致了。…...
java——继承
继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。继承是指在原有类的基础上,进行功能扩展,创建新的类型。 概念与作用 代码复用:继承能够避免重…...
STM32嵌入式开发从入门到实战:全面指南与项目实践
STM32嵌入式开发从入门到实战:全面指南与项目实践 一、STM32开发基础概述 1.STM32微控制器核心特性 STM32微控制器基于ARM Cortex - M内核,具备显著的架构优势。其32位处理能力,能够高效处理复杂的计算任务,相较于传…...
企业数据孤岛如何破
企业数据孤岛如何破 背景信息传统方式Flink CDC如何用技术之力 背景信息 在数字化转型的浪潮中,企业数据的价值正从“事后分析”向“实时驱动”快速迁移。企业需要快速、高效地将分散在不同系统中的数据整合起来,以支持实时分析和业务决策。诚然&#x…...