网易云课堂 浙江大学-陈越、何钦铭-数据结构基础习题集(自测)

题目链接: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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值