北理西交计算机夏令营机试题

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了北理西交计算机夏令营机试题相关的知识,希望对你有一定的参考价值。

一、北理

1.1 题目描述

给定任意个整数,以逗号隔开,输出最后一个重复数字,没有重复数字输出-1
输入:
1,2,3,4,4,3,2,1
1,2,3,4,5,6,7,8
输出
1
-1

首先得会怎样实现输入,用scanf实现对任意个整数的输入时,只要用非整数作为间隔就行(无论你是逗号,还是空格) 

# include<bits/stdc++.h>
using namespace std;

int main()
	int a[100];
	int i=0;
	char y;
	
	do
		scanf("%d",&a[i]);
		i++;
	while((y=getchar())!='\\n');  //注意getchar函数有返回值 
	
	
	for(int j=0;j<i;j++)  //注意只有a[0]~a[i-1]里有东西 
		printf("%d,",a[j]);
	
	return 0;

看到有人是将输入定义为字符串类型,然后再进行字符串的分割,费呢老大劲。

解答

# include<bits/stdc++.h>
using namespace std;

int main()
	int temp;
	int a[100];
	int i=0;
	int rep=-1;
	char y;
	bool exis=false;  //是否已经输入过了 
	do
		scanf("%d",&temp);
		for(int j=0;j<=i-1;j++)
			if(a[j]==temp)	//有重复 
				rep=temp;
				exis=true;	
			
		
		if(exis==false)  //没有重复 
			a[i]=temp;
			i++;	
				
	while((y=getchar())!='\\n');  
	
	if(rep==-1)
		printf("-1" ); 
	else
		printf("%d",rep); 
	return 0;

1.2题目描述

描述:一次shift操作就是把一个单词的第一个挪到最后,单词有n位就最多挪n次,问可以和原单词相同几次。
如输入:byebye    输出:2
    输入:abcd    输出:1

这次输入不要用上面的方法了。因为输入的是char,getchar接收的也是char,一来二去就乱套了。不要用下面这种方法!! 

char a[100];
	int i=0;
	char y;
	do
		scanf("%c",&a[i]);  //错误!!
		i++;
	while((y=getchar())!='\\n');

思路
将输入的string变量转化为char *。然后进行移位操作。

下面是个错误的代码。经过添加输出语句,发现temp指向的值居然和a一起变化,齐了个大怪!
原来是因为通过(char *)s.data()操作,直接把地址给a和temp了,也就是说a和temp指向了同一个地方。

# include<bits/stdc++.h>
using namespace std;

int shift(string s,int size)
	char *a=(char *)s.data();
	char *temp=(char *)s.data();//拷贝一个比较的时候用 
	
	int count=0;
	for(int i=1;i<=size;i++)  //有多少个移位多少次 
		char t=a[0];
		for(int j=1;j<=size-1;j++)  //除了第一个,整体向前一位 
			a[j-1]=a[j];
		
		a[size-1]=t;
		cout<<a<<endl;  //!!!!!!!!!一样
		cout<<temp<<endl;  //!!!!!!!一样
		if(strcmp(temp,a)==0)
			count++;
	
	return count;


int main()
	string s;
	cin>>s;
	int size=s.length();
	int result=shift(s,size);
	printf("%d",result);
	return 0;

为了避免以上问题,我们得换一个string向char数组转换的方法。于是找到了这个方法,利用c_str()函数!

string s="hello";
char a[20];
strcpy(a,s.c_str());//!!!!

解答

# include<bits/stdc++.h>
using namespace std;

int shift(string s,int size)
	char a[20];
	char temp[20];
	strcpy(a,s.c_str());
	strcpy(temp,s.c_str());
//	char *a=(char *)s.data();
//	char *temp=(char *)s.data();//拷贝一个比较的时候用 
	
	int count=0;
	for(int i=1;i<=size;i++)  //有多少个移位多少次 
		char t=a[0];
		for(int j=1;j<=size-1;j++)  //除了第一个,整体向前一位 
			a[j-1]=a[j];
		
		a[size-1]=t;
//		cout<<a<<endl;
//		cout<<temp<<endl;
		if(strcmp(temp,a)==0)
			count++;
	
	return count;


int main()
	string s;
	cin>>s;
	int size=s.length();
	int result=shift(s,size);
	printf("%d",result);
	return 0;

突然想到另一个方法,用substr(从哪开始截,截几个)函数试一下。不行!因为substr返回的还是string类型。

二、西安交通大学

2.1 矩阵加法

 首先学一下矩阵的输入,矩阵每一行的输入就是简单的scanf函数就可以

# include<bits/stdc++.h>
using namespace std;

int main()
    int n,m;
    scanf("%d%d",&n,&m);  //n行m列
    int num1[n][m];
    int num2[n][m];
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		   scanf("%d",&num1[i][j]);
		
	 
	
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		   scanf("%d",&num2[i][j]);
		
	 
	
    
	return 0; 

千万不要用这种傻逼的自创的矩阵输入,会报出runtime error。并且注意下面这种do-while的输入适用的情况是不知道输入整数的个数时

for(int i=0;i<n;i++)
		int k=0;
		char y;
		do
			scanf("%d",&num1[i][k]);
			k++
		while((y=getchar())!='\\n');
	 

正解

# include<bits/stdc++.h>
using namespace std;

int main()
    int n,m;
    scanf("%d%d",&n,&m);  //n行m列
    int num1[n][m];
    int num2[n][m];
    int sum[n][m];
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		   scanf("%d",&num1[i][j]);
		
	 
	
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		   scanf("%d",&num2[i][j]);
		
	 
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			sum[i][j]=num1[i][j]+num2[i][j];
			cout<<sum[i][j]<<' ';
		
		cout<<endl;
	

	return 0; 

以上是关于北理西交计算机夏令营机试题的主要内容,如果未能解决你的问题,请参考以下文章

北邮 北理 人大经验

祝贺西交世毕盟学员收获卡内基梅隆大学商业智能与数据分析录取!

C++编程试题:计算机学科丨编程夏令营上机考试题解

编程试题练习:2018计算机学科-夏令营上机考试题解

C++编程试题:计算机学科-夏令营上机考试题解

C++编程试题:计算机学科丨编程夏令营上机考试题解