2019年南京大学保研机试

原题链接和题解

    题目1:给你一个不超过100位的数n,和一个不超过100的数字k,要求从数n中去掉k个数字,然后使得去掉k个数之后,n最小。
    
    题解链接:https://blog.youkuaiyun.com/C20190413/article/details/77368590

代码1

#include<iostream>
using namespace std;
#include<cstring>
#include<string>
#include<vector>
const int MAXN=1005;

string str;
int del[MAXN];
int casee;
int n;
int k;

int main()
{
	cin>>casee;
	while(casee--)
	{
		memset(del,0,sizeof(del)); 
		cin>>str; 
		scanf("%d",&k);
	
		int i;
		while(k--)
		{
			int yes=0;
			for( i=0;i<str.size()-1;i++)
			{
				if(str[i]>=str[i+1])
				{
					str.erase(i,1);
					yes=1;
					break;
				}
			}
			if(!yes)
				str.erase(str.size()-1,1);
		}		
		cout<<str<<endl;
	}
	
	return 0; 
}

代码2 一遍扫描 没用erase

#include<iostream>
using namespace std;
#include<cstring>
#include<string>
#include<vector>
const int MAXN=1005;

string str;
int del[MAXN];
int casee;
int n;
int k;

int main()
{
	cin>>casee;
	while(casee--)
	{
		memset(del,0,sizeof(del)); 
		cin>>str; 
		str="0"+str;             //防止第一位就被删除 
		scanf("%d",&k);
		
		int i=0;
		int j=0;
		
		int num=0; 
		while(1)
		{
			if(i+1<str.size())   //每次跳一步 
				j=i+1;
			else j=i;
			
			while(j+1<str.size() && del[j])
			{
				j++;
			}
			if(str[i]<str[j])
			{
				i=j;
			}else{
				del[i]=1;
				num++;
				if(num==k)    //如果删除完毕 
				{
					break;
				}
				while(i-1>=0 && del[i])
				{
					i--;
				}
			}
		}
		
		for(int i=1;i<str.size();i++)   //不存在0    如果存在0,注意去掉前缀0 
		{
			if(!del[i])
				cout<<str[i];
		}
		cout<<endl;
	}
	
	return 0; 
}

题目3:
遍历


#include<iostream>
using namespace std;

 
//这样写更简单,在递归后判断 
int cal(string str1,string str2)
{
	int ans=0;

	if(!str1.size()||(str1.size()==1 && str1==str2))
		return 1;

	if(str1[0]!=str2[str2.size()-1]) 
		return 0;
			
			
	for(int len=0;len<=str1.size()-1;len++)
	{
		ans+=cal(str1.substr(1,len),str2.substr(0,len))*cal(str1.substr(len+1),str2.substr(len,str1.size()-1-len));
	}
	
	return ans;	
}

//在递归前判断 
//int cal(string str1,string str2)
//{
//	
//	int ans=0;
//	
//	if(!str1.size()||str1.size()==1)
//		return 1;
//	
//	for(int len=0;len<=str1.size()-1;len++)
//	{
//		if(len)
//		{
//			if(str1[1]!=str2[len-1])
//				continue;
//		}
//		if(len!=str1.size()-1)
//		{
//			if(str1[len+1]!=str2[str1.size()-2])
//				continue;
//		}
//		ans+=cal(str1.substr(1,len),str2.substr(0,len))*cal(str1.substr(len+1),str2.substr(len,str1.size()-1-len));
//	}
//	
//	return ans;	
//}

int main()
{
	string str1;
	string str2;
		
	cin>>str1>>str2;
		
	int ans=cal(str1,str2);
	cout<<ans;
	
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值