网易有道2017春季实习笔试编程题-个人解答-欢迎高手来优化

(无法还原原题描述,根据个人理解简化了题目的描述。希望没有歧义,如有错误敬请包含。)

(提供的前两题代码已通过全部测试,已被Accepted。但是期望更好的解答,望高手不吝赐教,如能留下更好理解或性能更优的代码,将不胜感激。)


第一题:

从坐标原点(0,0)出发到目的地(dx,dy)的最快时间计算。可以直接步行走到目的地,也可以先走到附近的车站,然后坐车到目的地。

x或y轴的一个单位走路时间为WalkTime,坐车单位花费时间为TextTime;

n代表附近车站个数,tx[n]和ty[n]分别保存附近车站的坐标。

代码:

#include <iostream>
using namespace std;
int main() {
    unsigned int n;
    cin>>n;
    int *tx=new int[n];
    int *ty=new int[n];
    for(unsigned int i=0;i<n;i++)
        cin>>tx[i];
    for(unsigned int i=0;i<n;i++)
        cin>>ty[i];
    int gx,gy,WalkTime,TextTime;
    cin>>gx>>gy;
	cin>>WalkTime>>TextTime;
	int ans=(abs(gx)+abs(gy))*WalkTime;
	for(unsigned int i=0;i<n;i++)
	{
		int tmp=(abs(tx[i])+abs(ty[i]))*WalkTime+(abs(gx-tx[i])+abs(gy-ty[i]))*TextTime;
		if(tmp<ans)
			ans=tmp;
	}
	cout<<ans;
	/*int *ans=new int[n+1];
	for(unsigned int i=0;i<n;i++)
	{
		ans[i]=(abs(tx[i])+abs(ty[i]))*WalkTime+(abs(gx-tx[i])+abs(gy-ty[i]))*TextTime;
	}
	ans[n]=(abs(gx)+abs(gy))*WalkTime;*/
	/*for(unsigned int i=0;i<n+1;i++)
	{
		cout<<ans[i];
	}*/
  system("pause");
}


第二题:

将只包含字符G和B的字符串,其中的G单独放一起,B单独放一起;只能相邻元素两两交换,求最少的交换次数
例子:将GGBBG变为GGGBB,最少交换2次

代码:(其实还有一种思路,将G存储为0,将B存储为1;利用冒泡排序,记录交换次数。升序和降序各排一次,记录较小的交换次数。)

#include <iostream>
#include<string>
using namespace std;
int main() {
    string s;
	int ans=0;
	cin>>s;
	string s2=s;
	for(unsigned i=0;i<s.size();i++)
	{
		int cc=0;
		while(i<s.size()&&s[i]=='G')i++;
		
		int index=i;
		//cout<<index<<endl;
		while(i<s.size()&&s[i]=='B'){cc++;i++;}
		int index1=i;
		if(i==s.size())break;
		if(s[i]=='G'){i=0;}
		ans+=cc;
		s[index]='G';
		s[index1]='B';
	}
	int ans2=0;
	s=s2;
	for(unsigned i=0;i<s.size();i++)
	{
		int cc=0;
		while(i<s.size()&&s[i]=='B')i++;
		
		int index=i;
		//cout<<index<<endl;
		while(i<s.size()&&s[i]=='G'){cc++;i++;}
		int index1=i;
		if(i==s.size())break;
		if(s[i]=='B'){i=0;}
		ans2+=cc;
		s[index]='B';
		s[index1]='G';
	}
	if(ans2<ans)ans=ans2;	
	//int ans2;

	cout<<ans;
    system("pause");
}

第三题:(由于时间限制,本人没能写完这个程序并提交,所以不知道是否能被Accepted)

输入一个整数数组a和元素个数n,循环一次更新数组元素为:a[i]=a[i]+a[i+1],其中a[-1]=a[n-1]+a[0]。输出循环k次后的数组元素。

代码:

(暴力解决,时间复杂度O(n*k),空间复杂度O(1),可能会超时)

#include<iostream>
using namespace std;
void fun();
int main()
{
	int n,k;
	cin>>n;
	int *a=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	cin>>k;
	for(int i=0;i<k;i++)
	{
		int tmp=a[0];
		for(int i=0;i<n-1;i++)
		{
			a[i]=a[i]+a[i+1];
		}
		a[n-1]=a[n-1]+tmp;
	}
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
	delete[] a;
	system("pause");
	return 0;
}

利用杨辉三角优化代码:

//优化一下,杨辉三角第k层
#include<iostream>
#include<time.h>
using namespace std;
void k_YangHui(int k);//计算杨辉三角的第k+1行数据,并存入全局变量YangHui
int XLCheng(int* a,int n,int start_index,int* coeef,int k);//数组a,有n个元素,从start_index下标开始,此后k个数与数组coeef的相乘求和(向量成绩)
int* YangHui;
int k;
int main()
{
	time_t begin,stop;
	begin=clock();
	int n;
	cin>>n;
	int *a=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	cin>>k;
	k_YangHui(k);
	//for(int i=0;i<k+1;i++)
	//{
	//	cout<<YangHui[i];
	//}
	//	cout<<endl;
	int *b=new int[n];
	for(int i=0;i<n;i++)
	{
		b[i]=a[i];
	}
	for(int i=0;i<n;i++)
	{
		a[i]=XLCheng(b,n,i,YangHui,k);
	}
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
	delete[] a,b,YangHui;
	stop=clock();
	double during=double(stop-begin)/CLOCKS_PER_SEC;
	cout<<"\n运行时间:"<<during<<"s";
	system("pause");
	return 0;
}
void k_YangHui(int k)
{
	int row=0,col=0,left=0,right=0;
	YangHui=new int[k+1];
	for(int i=0;i<k+1;i++)
		YangHui[i]=1;
	for(;row<k;row++)
	{
		left=0;
		for(col=0;col<=row;col++)
		{
			right=YangHui[col];
			YangHui[col]=left+right;
			left=right;
		}
	}
}
int XLCheng(int* a,int n,int start_index,int* coeef,int k)
{
	int i=start_index;
	int sum=0;
	for(int j=0;j<k+1;j++)
	{
		i=i%n;
		sum+=a[i++]*coeef[j];
	}
	//cout<<sum<<endl;
	return sum;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值