矿大数据结构作业第二次代码2023

1.题目描述

现在给你一个字符串S,请你计算S中有多少连续子串是回文串。

输入

输入包含多组测试数据。每组输入是一个非空字符串,长度不超过5000。

输出

对于每组输入,输出回文子串的个数。

样例输入 复制
aba
aa
样例输出 复制
4
3
#include <iostream>
#include <string>
using namespace std;
int countPalindromes(string m) {
    int n = m.length();
    int count = 0;

    for (int i = 0; i < n; i++) {
        // 寻找以当前字符为中心的回文字符串
        int left = i, right = i;
        while (left >= 0 && right < n && m[left] == m[right]) {
            count++;
            left--;
            right++;
        }
        // 寻找以当前字符和下一个字符为中心的偶数长度的回文字符串
        left = i, right = i + 1;
        while (left >= 0 && right < n && m[left] == m[right]) {
            count++;
            left--;
            right++;
        }
    }
    return count;
}
int main() {
    string m;
    while (cin >> m) {
        int sum = countPalindromes(m);
        cout << sum << endl;
    }
}

 

2.题目描述

现请你构建一个N*N的矩阵,第i行j列的元素为i与j的乘积。(i,j均从1开始)

输入

输入的第一行为一个正整数C,表示测试样例的个数。
然后是C行测试样例,每行为一个整数N(1<=N<=9),表示矩阵的行列数。

输出

对于每一组输入,输出构建的矩阵。

样例输入 复制
2
1
4
样例输出 复制
1
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
#include<iostream>
using namespace std;
int main()
{
	int n, m;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> m;
		for (int j=0; j < m; j++)
		{
			for (int v = 0; v < m; v++)
			{
				cout<< (j + 1) * (v + 1)<<" ";
			}
			cout << '\n';
		}
	}
}

 

3.题目描述

小宇正在读小学,今天老师布置了几道数学题目。小宇平时上课经常不专心,这些他可发愁了,怎么办呢?看看你能不能帮帮他。
题目是给你一组有规律序列的前面5个整数,请你给出它后面跟着的5个整数,如:1,2,3,4,5,___,___,___,__,___。这是个等差数列,后面应该是6,7,8,9,10,就这么简单。而且现在小宇已经知道这串序列要么是等差数列,要么是等比数列或者是斐波那契数列。

输入

输入包含多组测试数据。每组输入5个整数,每个数字之间隔一个空格,当5个数字都为0时输入结束。

输出

对于每组输入,输出这串数列的后面5个数字,每个数字之间隔一个空格。

样例输入 复制
1 2 3 4 5
1 2 4 8 16
1 2 3 5 8
0 0 0 0 0
样例输出 复制
6 7 8 9 10
32 64 128 256 512
13 21 34 55 89
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
void function(vector<int>&vec)
{
	if (vec[4] - vec[0] == 4 * (vec[1] - vec[0]))
	{
		int d = vec[1] - vec[0];
		vec.push_back(vec[4] + d);
		cout << vec[4] + d<<" ";
		vec.push_back(vec[5] + d);
		cout << vec[5] + d << " ";
		vec.push_back(vec[6] + d);
		cout << vec[6] + d << " ";
		vec.push_back(vec[7] + d);
		cout << vec[7] + d << " ";
		vec.push_back(vec[8] + d);
		cout << vec[8] + d << endl;
	}
	if (vec[0] * pow((vec[1] / vec[0]) , 4) ==vec[4])
	{
		int q = vec[1] / vec[0];
		vec.push_back(vec[4] * q);
		cout << vec[4] * q << " ";
		vec.push_back(vec[5] * q);
		cout << vec[5] * q << " ";
		vec.push_back(vec[6] * q);
		cout << vec[6] * q << " ";
		vec.push_back(vec[7] * q);
		cout << vec[7] * q << " ";
		vec.push_back(vec[8] * q);
		cout << vec[8] * q << endl;
	}
	if(vec[4]==vec[3]+vec[2])
	{
		vec.push_back(vec[4] + vec[3]);
		cout << vec[4] + vec[3] << " ";
		vec.push_back(vec[5] + vec[4]);
		cout << vec[5] + vec[4] << " ";
		vec.push_back(vec[6] + vec[5]);
		cout << vec[6] + vec[5] << " ";
		vec.push_back(vec[7] + vec[6]);
		cout << vec[7] + vec[6] << " ";
		vec.push_back(vec[8] + vec[7]);
		cout << vec[8] + vec[7] << endl;
	}
}
int main()
{
	vector<int>vec;
	int m;
	while (1) {
		for (int i = 0; i < 5; i++)
		{
			cin >> m;
			vec.push_back(m);
		}
		if (vec[0] ==0&& vec[1] ==0&& vec[2] ==0&& vec[3] ==0&& vec[4]==0)
		{
			break;
		}
		function(vec);
		vec.clear();
	}
}
4.题目描述

小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。

输入

输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写字母组成。

输出

对于每组输入,输出对应的二叉树的后续遍历结果。

样例输入 复制
DBACEGF ABCDEFG
BCAD CBAD
样例输出 复制
ACBFGED
CDAB
#include<iostream>
#include<string>
using namespace std;
string pre;//前序
string in; //中序
void post(int root, int start, int end)
{
    //递归打印这棵树的后序,递归出口为 start > end
    if (start > end)
        return;
    int i = start;//i为 root所代表的值在中序中的下标
    while (i < end && in[i] != pre[root])
        i++;
    int cnt = i - start;//左子树结点个数
    post(root + 1, start, i - 1);
    post(root + 1 + cnt, i + 1, end);
    printf("%c", pre[root]);
}
int main()
{
    while (cin >> pre >> in) {
        int len = pre.length();
        post(0, 0, len - 1);
        printf("\n");
    }
    return 0;
}

 

题目描述

给你一颗二叉树的中序和后序遍历序列,请编程输出该二叉树左子树或右子树的后序遍历序列。

输入

占三行,第一行表示二叉树的中序遍历序列,第二行表示后序遍历序列。用大写字母标识结点,二叉树的结点最多26个。
第三行是单个字母,L表示要求输出该二叉树的左子树的后序遍历序列,R表示要求输出该二叉树的右子树的后序遍历序列。

输出

按要求输出该二叉树左子树或右子树的后序遍历序列。

样例输入 复制
BDCEAFHG
DECBHGFA
R
样例输出 复制
HGF
#include<vector>
#include<iostream>
using namespace std;
void treerankright(vector<char>&midtree, vector<char>& retree)
{
	int i = 0;
	while (midtree[i] != retree.back())
	{
		i++;
	}
	int mm = i;
	while (mm < retree.size()-1)
	{
		cout << retree[mm];
		mm++;
	}
}
void treerankleft(vector<char>& midtree, vector<char>& retree)
{
	int i = 0;
	while (midtree[i] != retree.back())
	{
		i++;
	}
	int mm = i;
	for(int j=0;j<mm;j++)
	{
		cout << retree[j];
	}
}
int main()
{
	string m,n;
	vector<char>midtree,retree;
	cin >> m;
	for (int j = 0; j < m.length(); j++)
	{
		midtree.push_back(m[j]);
	}
	cin >> n;
	for (int j = 0; j < n.length(); j++)
	{
		retree.push_back(n[j]);
	}
	char f;
	cin >> f;
	if (f == 'R')
	{
		treerankright(midtree, retree);
	}
	if (f == 'L')
	{
		treerankleft(midtree, retree);
	}
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值