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); } }