第四周中级练习

1.矩阵原地转置(10分)

题目内容:

编写程序,将N(N<=10)阶方阵(整型)原地转置(只能使用一个二维数组),例如:

转置前的方阵A

5 6 7 9

2 8 5 4

3 7 16 15

1 4 8 11

转置后的方阵A

5 2 3 1

6 8 7 4

7 5 16 8

9 4 15 11

注意:转置要使矩阵本身作转置运算,而不仅是在屏幕显示转置效果。

输入格式:

N+1行,第1行:数字N(10>=n>0);第2-(N+1)行:N阶方阵的元素

输出格式:

N行,转置后的矩阵。每行数据间用一个空格隔开,末尾无空格。

输入样例:

4

5 6 7 9

2 8 5 4

3 7 16 15

1 4 8 11

输出样例:

5 2 3 1

6 8 7 4

7 5 16 8

9 4 15 11

时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void transpose(int a[][10], int n);
int main()
{
	int a[10][10];
	int n;
	cin>>n;
	for(int i=0; i<n; i++)
		for(int j=0; j<n; j++)
			cin>>a[i][j];
	transpose(a,n);
	for(int i=0; i<n; i++)
	{
		cout<<a[i][0];
		for(int j=1; j<n; j++)
			cout<<" "<<a[i][j];
		cout<<endl;
	}
	return 0;
}
//转置就是交换a[i][j]与a[j][i],注意循环的条件
void transpose(int a[][10], int n)
{
	for(int i=0; i<n; i++)
	{
		for(int j=0; j<i; j++)
		{
			int temp = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = temp;
		}
	}
}

2.判断对称矩阵(10分)

题目内容:

判断一个N阶整型矩阵是否为对称矩阵。要求矩阵用一维数组存储。

输入格式:

N+1行,第1行:数字N(10>n>0);第2-(N+1)行:N阶方阵的元素

输出格式:

“Yes”或“No”

输入样例:

4

5 6 7 9

2 8 5 4

3 7 16 15

1 4 8 11

输出样例:

No

时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
bool isSymMat(int a[][10], int n);//二维数组的列数要预先确定
int main()
{
	int a[10][10];
	int n;
	cin>>n;
	for(int i=0; i<n; i++)
	{
		for(int j=0; j<n; j++)
			cin>>a[i][j];
	}
	if(isSymMat(a,n))
		cout<<"Yes"<<endl;
	else
		cout<<"No"<<endl;
	return 0;
}
bool isSymMat(int a[][10], int n)//和上道题相似,这是判断是否相等
{
	bool sign = true;
	for(int i=0; i<n; i++)
	{
		for(int j=0; j<i; j++)
		{
			if(a[i][j]!=a[j][i])
			{
				sign = false;
				break;
			}
		}
	}
	return sign;
}

3.去掉字符串末尾的空格(10分)

题目内容:

编写程序,去掉字符串末尾的空格符。要求字符串用字符数组存放,不使用库函数。结果要显示原字符串和删除末尾空格后的字符串。字符串长度不超过100.

输入格式:

一个字符串

输出格式:

两行:第一行,原字符串;第二行,删除末尾空格后的字符串。注意,将原字符串和删除空格后的字符串均放到‘|’’|’中。

输入样例:

strd sdf

输出样例:

|strd sdf |

|strd sdf|

时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void delSpace(char str[]);
int main()
{
	char s[110];
	cin.getline(s,100);
	cout<<"|"<<s<<"|"<<endl;
	delSpace(s);
	cout<<"|"<<s<<"|"<<endl;
	return 0;
}
void delSpace(char str[])//去除末尾的空格可以直接把字符的后面变成'\0'
{
	char *p = str;
	while(*p++);
	p = p-2;	//找到字符串末尾
	while(*p==' ')//把末尾的空格变成'\0'
	{
		*p = '\0';//可以把这句去掉,在循环外写*(p+1)=0;
		p--;
	}
}

4.去掉字符串开头的空格符(10分)

题目内容:

编写程序,去掉字符串开头的空格符。要求字符串用字符数组存放,不使用库函数。字符串长度不超过100.

输入格式:
一个字符串

输出格式:
两行:第一行,原字符串;第二行,删除开头空格后的字符串。注意,将原字符串和删除空格后的字符串均放到‘|’’|’中。参照样例。

输入样例:

strd sdf

输出样例:

| strd sdf|

|strd sdf|
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void delSpace(char str[]);
int main()
{
	char s[110];
	cin.getline(s,110);
	cout<<"|"<<s<<"|"<<endl;
 	delSpace(s);
	cout<<"|"<<s<<"|"<<endl;
	return 0;
}
void delSpace(char str[])//采取的是将字符串整体前移消去空格
{
	char *p = str, *q = str;
	while(*p==' ')
		p++;	//找到开头不是空格的字符
	while(*p)	//前移
	{
		*q = *p;
		p++;
		q++;
	}
	*q = 0;
}

5.去掉字符串中间的所有空格(10分)

题目内容:

编写程序,去掉字符串中间的所有空格(保持两头的空格)。要求字符串用字符数组存放,不使用库函数。字符串长度不超过100.

输入格式:一个字符串

输出格式:两行:第一行,原字符串;第二行,删除中间空格后的字符串。注意,将原字符串和删除空格后的字符串均放到‘|’’|’中。参照样例。

输入样例:

strd sdf

输出样例:

|strd sdf|

|strdsdf|

时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void delSpace(char str[]);
void movForward(char *p,char *q);
int main()
{
	char s[110];
	cin.getline(s,110);
	cout<<"|"<<s<<"|"<<endl;
	delSpace(s);
	cout<<"|"<<s<<"|"<<endl;
	return 0;
}
void delSpace(char str[])//思路:每读到一个空格,把空格后面所有东西前移
{
	char *p = str;
	char *q = str;
	while(*p==' ')
		p++;	
	//保留开头的空格
	do
	{
		while(*p!=' '&&*p!=0)//找到不是空格的元素,要防止p==0
			p++;
		q = p;	//q和p指向相同的位置
		while(*q==' ')//用q找到所有空格之后的元素
			q++;
 		if(*q!=0)//如果不是字符串结尾,就把q后面整体移到p那里
 				 //这可以保护字符串末尾的空格
			movForward(p,q);
	}while(*p!=' '&&*p!=0);//当还没有把所有空格消完就继续循环

}
void movForward(char *p,char *q)
{
	while(*q)
	{
		*p = *q;
		*q = ' ';
		q++;
		p++;
	}
	*p = '\0';//移到前面后要把字符串末尾变成0
}
//可以用一个新的字符数组, 通过复制,把空格省略

6.查找子串(10分)

题目内容:

编写程序,在字符串中查找子字符串,找到则返回第一个字符所在的位置(从1开始),找不到则显示“没有该子串”。要求字符串用字符数组存放,不使用库函数。字符串长度不超过100.

输入格式:

两行:第一行为待查找的字符串;第二行为要查找的子字符串。

输出格式:

第一个字符所在的位置(从1开始),若找不到则显示“没有该子串”。

输入样例1:

This is a book!

is

输出样例1:

3

输入样例2:

This is a book!

isa

输出样例2:

没有该子串
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int findStr(char str[], char dest[]);
bool isEqual(char *p, char *q);
int main()
{
	char str[100];
	char dest[100];
	cin.getline(str,100);
	cin.getline(dest,100);
	int idx = findStr(str,dest);
	if(idx==-1)
		cout<<"没有该子串"<<endl;
	else
		cout<<idx+1<<endl;
	return 0;
}
int findStr(char str[], char dest[])//枚举,复杂度比较高
{
	char *p = str;
	char *q = dest;
	int ret = -1;
	while(*p!=0)
	{
		if(isEqual(p,q))
		{
			ret = p-str;
			break;
		}
		p++;
	}
	return ret;
}
bool isEqual(char *p, char *q)//判断序列是否相同
{
	bool sign = true;
	while(*q!=0)
	{
		if(*p!=*q)
		{
			sign = false;
			break;
		}
		p++;
		q++;
	}
	return sign;
}

7.排序(10分)

题目内容:

输入n个整数,对它们进行排序,从大到小输出。0<n<=100。注意,不应使用别人写的库函数。

输入格式:

两行,第1行为元素个数n;第2行为n个整数,用空格隔开。

输出格式:

n个排好序的整数,从大到小用一个空格隔开,末尾无空格。

输入样例:

5

1 2 5 4 3

输出样例:

5 4 3 2 1

时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void swap(int &a, int &b);
void quickSort(int a[], int left, int right);
int main()
{
	int a[100];
	int n;
	cin>>n;
	for(int i=0; i<n; i++)
		cin>>a[i];
	quickSort(a,0,n-1);
	cout<<a[0];
	for(int i=1; i<n; i++)
		cout<<" "<<a[i];
	cout<<endl;
	return 0;
}
void swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}
void quickSort(int a[], int left, int right)//快速排序
{
	int i = left, j = right;
	int pivot = a[(i+j)/2];
	while(i<=j)
	{
		while(a[i]>pivot)   i++;//找到左边比基准值小的元素
		while(a[j]<pivot)   j--;//找到右边比基准值大的元素
		if(i<=j)				//如果位于基准值两边时就交换
		{
			swap(a[i], a[j]);
			i++;
			j--;
		}
	}
	if(j>left)  quickSort(a,left,j);//对左边递归进行
	if(i<right) quickSort(a,i,right);//对右边递归进行
}

8.二分查找(10分)

题目内容:

从小到大输入若干整数(不超过300),以-99999为结束符,然后再输入一个整数x,z在前面的整数中用二分查找法查找x,若找到,显示数的下标(即从0开始的序号);若找不到,显示-1。注意,不应使用别人写的库函数。

输入格式:

若干整数。

输出格式:

一个下标

输入样例:

1 2 3 4 5 -99999

2

输出样例:

1

时间限制:200ms内存限制:32000kb

#include <iostream>
using namespace std;
int binarySearch(int a[], int left, int right, int dest);
int main()
{
	int a[310];
	int i=0;
	int num;
	while(cin>>num&&num!=-99999)
		a[i++] = num;
	int dest;
	cin>>dest;
	int idx = binarySearch(a,0,i-1,dest);
	cout<<idx<<endl;
	return 0;
}
int binarySearch(int a[], int left, int right, int dest)
{
	while(left<=right)//只要数组还没空
	{
		int midIdx = (left+right)/2;//就取中间值比较
		int mid = a[midIdx];
		if(dest>mid)	//中间值小了,说明目标数在右边,就把左端右移
			left = midIdx+1;
		else if(dest<mid)//中间值大了,说明目标数在左边,就把右端左移
			right = midIdx-1;
		else
			return midIdx;//找到后就返回
    }
    return -1;
	
}
//二分查找必须是有序序列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值