网易云课堂 浙江大学-陈越、何钦铭-数据结构基础习题集(自测)
题目链接:http://www.patest.cn/contests/mooc-ds
【打印沙漏】
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; int num[1000]; int main(){ num[1]=1; int sum=0; int tmp=1; for(int i=1;i<32;i++){ num[i+1]=num[i]+2*(2*(i+1)-1); //找到规律,将所有<span style="font-family:Microsoft YaHei;">形状沙漏所需要的点存起来</span> } int n; char ch; cin>>n>>ch; int ans=0,now; for(int i=1;i<32;i++){ if(n>=num[i]&&n<num[i+1]){ ans=n-num[i]; now=i; break; } } for(int i=0;i<now;i++){ for(int j=0;j<i;j++) printf(" "); for(int j=0;j<now*2-1-i*2;j++) printf("%c",ch); //for(int j=0;j<i;j++) //<span style="font-family:Microsoft YaHei;"> 并不需要输出的多余的空格 , 输出就错了</span> //printf(" "); printf("\n"); } for(int i=0;i<now-1;i++){ for(int j=i+1;j<now-1;j++) printf(" "); for(int j=0;j<3-(i*-2);j++) printf("%c",ch); // for(int j=i+1;j<now-1;j++) // printf(" "); printf("\n"); } cout<<ans<<endl; return 0; }【素数对猜想】
#include <iostream> using namespace std; int prime[100010]; int num[100010]; int main(){ int cnt=0; int n; cin>>n; for(int i=2;i<=n;i++){ //筛选素数 if(!prime[i]){ num[cnt++]=i; for(int j=i*2;j<n;j+=i){ prime[j]=1; } } } int ans=0; for(int i=1;i<cnt;i++){ if(num[i]-num[i-1]==2){ ans++; } } cout<<ans<<endl; return 0; }【数组元素循环右移问题】
#include <iostream> using namespace std; int num[110]; int main(){ int n,m; cin>>n>>m; if(m>n) //<span style="font-family:Microsoft YaHei;">特殊情况,右移的距离大于数组本身的长度</span>,取余即可,因为<span style="font-family:Microsoft YaHei;">右移本身距离数组不变</span> m=m%n; for(int i=0;i<n;i++) cin>>num[i]; int sign=0; for(int i=n-m;i<n;i++){ if(i!=n-m) cout<<" "; cout<<num[i]; sign=1; } for(int i=0;i<n-m;i++){ if(sign){ cout<<" "<<num[i]; } else{ if(i!=0) cout<<" "; cout<<num[i]; } } cout<<endl; return 0; }【Have fun with numbers】
#include <iostream> #include <algorithm> using namespace std; int numb[23]; int numc[23]; int numd[23]; int main(){ string num; cin>>num; int len=num.length(); for(int i=len-1;i>=0;i--){ numb[len-i-1]=num[i]-'0'; numc[len-i-1]=num[i]-'0'; //因为要将*2 变成 相加,所以用2个数组同时<span style="font-family:Microsoft YaHei;">存</span>,<span style="font-family:Microsoft YaHei;">以便后面进位</span> } int sign=len; for(int i=0;i<len;i++){ int sum=numb[i]+numc[i]; if(sum>9){ numb[i]=sum-10; <span style="font-family:Microsoft YaHei;">//进位</span> if(i==len-1){ sign=len+1; } numb[i+1]+=1; } else { numb[i]=sum; } } if(sign==len+1){ //如果出现<span style="font-family:Microsoft YaHei;">多进了一位,则不可能与之前的相同,至少多了一个元素</span> cout<<"No"<<endl; for(int i=len;i>=0;i--) cout<<numb[i]; cout<<endl; } else{ for(int i=0;i<sign;i++){ numd[i]=numb[i]; //因为后面排序,所以先将改变完的数组存起来 } sort(numb,numb+len); sort(numc,numc+len); int flag=0; for(int i=0;i<sign;i++){ if(numb[i]!=numc[i]){ flag=1;break; //排序后一一对比 } } if(flag){ cout<<"No"<<endl; } else cout<<"Yes"<<endl; for(int i=sign-1;i>=0;i--) cout<<numd[i]; cout<<endl; } return 0; }【复杂度,最大子列和问题1】
O(n)方法,用c++输入方法21ms,c语言 9ms
#include<cstdio> using namespace std; const int maxn= 100000; int main(){ int n; scanf("%d",&n); int thisSum,Max; thisSum=Max=0; int now; for(int i=0;i<n;i++){ scanf("%d",&now); thisSum+=now; if(thisSum>Max) Max=thisSum; if(thisSum<0) thisSum=0; } printf("%d\n",Max); return 0; }【复杂度2,Maximum Subsequence Sum】
题目较坑,要考虑 全是 负数,全是0 ,既有负数又有零的情况
#include<cstdio> using namespace std; typedef long long ll; const long long maxn= 100000+10; int main(){ ll n; scanf("%lld",&n); ll thisSum,Max; thisSum=Max=0; ll st,stx,end; ll now; ll sign=0; ll start_i,end_i; ll flag=1; ll flag2=1; for(ll i=0;i<n;i++){ scanf("%lld",&now); if(now>=0) flag=0; if(!flag){ if(now>0) flag2=0; } if(i==0) { st=now;end=now;stx=now; start_i=now; } if(i==n-1){ end_i=now; } thisSum+=now; if(sign&&thisSum>0){ stx=now; sign=0; } if(thisSum>Max){ Max=thisSum; end=now; st=stx; } if(thisSum<0){ thisSum=0; sign=1; } } if(Max==0&&flag) printf("%lld %lld %lld\n",Max,start_i,end_i); else if(!flag&&flag2) printf("0 0 0\n"); else printf("%lld %lld %lld\n",Max,st,end); return 0; }