1
显示出如下数组中的所有元素,并使用二分查找法在数组中查找元素。
int a[]={-90,-32,12,16,24,36,45,59,98,120};
输入输出示例:
-90 -32 12 16 24 36 45 59 98 120
请输入所要查找的元素:24
输出:第5个元素为24,比较次数为1
请输入所要查找的元素:120
输出:第10个元素,比较次数为4
请输入所要查找的元素:6
输出:查找失败 比较次数为3
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
int main()
{
int a[] = { -90,-32,12,16,24,36,45,59,98,120};
int b = 0;
int c = 0;
int low = 0, high = 9, mid = 0;
bool flag = 0;
cout << "请输入所要查找的元素:";
while (cin>>b) {
flag = 0;
low = 0;
high = 9;
c = 0;
while (low <= high) {
mid = (low + high) / 2;
if (a[mid] == b) {
flag = 1;
c++;
cout << "第" << mid+1 << "个元素为" << a[mid] << ",比较次数为" << c << endl;
break;
}
else if (a[mid] > b) {
high = mid - 1;
c++;
}
else {
low = mid + 1;
c++;
}
}
if (!flag)
cout << "查找失败 比较次数为" << c << endl;
cout << "请输入所要查找的元素:";
}
return 0;
}
2
输入学生个数以及每个学生的姓名和3门课程成绩:输出不及格学生的信息;按平均成绩排序,从高到低输出学生信息。
输入示例:
5
zhaoyi 70 80 91
zhanger 68 40 90
zhangsan 60 70 80
lisi 70 80 90
wangwu 52 70 100
输出示例:
zhanger score:68 40 99
wangwu score:52 70 100
[1] name:zhaoyi 70 80 91
[2] name:lisi 70 80 90
[3] name:wangwu 52 70 100
[4] name:zhangsan 60 70 80
[5] name:zhanger 68 40 99
#include "pch.h"
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct stu {
string name;
int s1;
int s2;
int s3;
int ave;
};
bool cmp(stu a, stu b) {
return a.ave > b.ave;
}
int main()
{
const int L = 100;
stu s[L];
int i = 0, j = 0;
int c = 0;
cout << "输入:" << endl;
c = 0;
while (cin >> s[i].name >> s[i].s1 >> s[i].s2 >> s[i].s3) {
s[i].ave = (s[i].s1 + s[i].s2 + s[i].s3) / 3;
c++;
i++;
if (c >= 100)
break;
}
cout << "不及格:" << endl;
for (i = 0; i < c; i++) {
if (s[i].s1 < 60 || s[i].s2 < 60 || s[i].s3 < 60) {
cout << s[i].name << ' ' << s[i].s1 << ' ' << s[i].s2 << ' ' << s[i].s3 << endl;
}
}
cout << "排名:" << endl;
sort(s, s + c, cmp);
for (i = 0; i < c; i++) {
cout << '[' << i + 1 << ']' << ':';
cout << s[i].name << ' ' << s[i].s1 << ' ' << s[i].s2 << ' ' << s[i].s3 << endl;
}
return 0;
}
3
输入学生信息,姓名 成绩(成绩的数目不一定)
输出每个学生的学号和平均成绩,以及不及格课程数超过2的学生,按不及格课程数从大到小排好序输出。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
struct student {
string name;
vector<int> score;
int num;
int ave;
};
bool cmp(student& a, student& b) {
return a.num > b.num;
}
int main() {
string info;
student stu;
vector<student> s;
int i = 0, j = 0;
int f = 0;
bool flag = 0;
int sum = 0;
flag = 1;
while (cin >> info) {
try {
f = stoi(info);
stu.score.push_back(f);
}
catch (...) {
if (flag) {
stu.name = info;
flag = 0;
}
else {
s.push_back(stu);
stu.score.clear();
stu.name = info;
}
}
}
s.push_back(stu);
for (i = 0; i < s.size(); i++) {
s[i].num = 0;
sum = 0;
for (j = 0; j < s[i].score.size(); j++) {
sum += s[i].score[j];
if (s[i].score[j] < 60) {
s[i].num++;
}
}
s[i].ave = sum / s[i].score.size();
}
cout << "不及格科目数超过2:";
for (i = 0; i < s.size(); i++) {
if (s[i].num > 2) {
cout << s[i].name;
}
}
cout << endl;
sort(s.begin(), s.end(), cmp);
for (i = 0; i < s.size(); i++) {
cout << s[i].name << ":" << s[i].num << s[i].ave << endl;
}
return 0;
}
输入:
zhangsan 20 30 40
lisi 100 20
wangwu 20 50 60 70 45 46
输出:
4
输入字符串,输出字符串中包含的数字,比如 2.3ABC0-2.3 输出 2.3 0 -2.3。
注意一些特殊的情况如+004.500值为+4.5
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
string str;
vector<string> ss;
vector<string>::iterator it;
int i = 0, j = 0, k = 0;
while (cin >> str) {
for (i = 0; i < str.size(); i++) {
if (str[i] >= '0'&&str[i] <= '9') {
for (j = i; j < str.size(); j++) {
if (str[j] >= '0'&&str[j] <= '9' || str[j] == '.') {
continue;
}
else {
break;
}
}
ss.push_back(str.substr(i, j - i));
i = j - 1;
}
else if (str[i] == '-' || str[i] == '+') {
if (i + 1 < str.size()) {
for (j = i + 1; j < str.size(); j++) {
if (str[j] >= '0'&&str[j] <= '9' || str[j] == '.') {
continue;
}
else {
break;
}
}
if (j > i + 1) {
ss.push_back(str.substr(i, j - i));
i = j - 1;
}
}
}
}
for (it = ss.begin(); it != ss.end(); it++) {
if ((*it).size() < 2)
continue;
if ((*it)[0] == '+' || (*it)[0] == '-') {
while ((*it)[1] == '0') {
(*it).erase((*it).begin()+1);
}
while ((*it)[(*it).size()-1] == '0') {
(*it).erase((*it).end()-1);
}
}
else {
while ((*it)[0] == '0') {
(*it).erase((*it).begin());
}
while ((*it)[(*it).size() - 1] == '0') {
(*it).erase((*it).end()-1);
}
}
}
for (it = ss.begin(); it != ss.end(); it++) {
cout << *it << endl;
}
cout << "---\n" << endl;
ss.clear();
}
return 0;
}
5
字符串由“碎片”组成,每个碎片为单一字母所组成,如“aaabbccaddd”由碎片“aaa”“bb”“cc”“a”“ddd”组成。
输入:一个字符串
输出:按字典序输出组成字符串的碎片,每个碎片一行,相同的碎片只输出一次
输入:aaabbaccdddda
输出:
a
aaa
bb
cc
dddd
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
string input;
vector<string> ss;
vector<string>::iterator e, it;
int i = 0, j = 0;
while (cin >> input) {
for (i = 0; i < input.size(); i++) {
for (j = i; j < input.size(); j++) {
if (input[i] != input[j]) {
break;
}
}
ss.push_back(input.substr(i, j - i));
i = j - 1;
}
sort(ss.begin(), ss.end());
e = unique(ss.begin(), ss.end());
for (it = ss.begin(); it!=e; it++) {
cout << *it << endl;
}
ss.clear();
}
return 0;
}
6
求哈夫曼树的最短带权路径长度
输入:第一行为权值个数n,第二行是n个权值
输出:最短带权路径长度
输入:
4
2,4,5,7
输出:
35
输入:
4
1,1,1,1
输出:
8
最短带权路径长度 = 所有非叶节点权值之和
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n = 0;
int i = 0, temp = 0;
int sum = 0;
vector<int> power;
cin >> n;
for (i = 0; i < n; i++) {
cin >> temp;
power.push_back(temp);
}
sort(power.begin(), power.end());
sum = 0;
while (power.size() != 1) {
sum += power.at(0) + power.at(1);
power.push_back(power.at(0) + power.at(1));
power.erase(power.begin());
power.erase(power.begin());
sort(power.begin(), power.end());
}
cout << sum << endl;
return 0;
}
最大回文子串
输入一个只含有英文字母的字符串,输出最大回文子串的长度及此长度回文子串的个数(回文不区分大小写)。
测试样例:
aBaAb (最大回文子串为BaAb)
4 1
aBcbBb (最大回文子串为Bcb和bBb)
3 2
aB
1 2
aBcbB
3 1
aaaaaa
6 1
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int i = 0, j = 0;
int count = 0;
int L = 0;
string str;
string s1, s2;
bool flag = 0;
getline(cin, str);
for (i = 0; i < str.size(); i++) {
if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] += 'a' - 'A';
}
}
flag = 0;
for (i = str.size(); i > 0; i--) {
count = 0;
for (j = 0; j < str.size() - i + 1; j++) {
s1 = str.substr(j, i);
s2 = s1;
reverse(s2.begin(), s2.end());
if (s1 == s2) {
L = i;
count++;
flag = 1;
}
}
if (flag)
break;
}
cout << L << " " << count << endl;
return 0;
}
文件记录序列
file() 是第一题
file2() 是第二题
#include<iostream>
#include<algorithm>
#include<vector>
#define MAXSIZE 10
using namespace std;
struct fcb {
int name;
int time;
fcb():name(0),time(0){}
};
bool cmp(fcb x, fcb y) {
return x.time < y.time;
}
void file() {
int Q[MAXSIZE] = { 0 };
int len = 0, front = 0, rear = 0;
int f = 0;
int i = 0;
cout << "输入:";
while (cin >> f) {
if (len < 3) {
if (len == 0) {
Q[rear++] = f;
len++;
}
else if (len == 1 && Q[front] != f) {
Q[rear++] = f;
len++;
}
else if (len == 2 && Q[front] != f && Q[front + 1] != f) {
Q[rear++] = f;
len++;
}
}
else {
if (Q[front] != f && Q[(front + 1) % MAXSIZE] != f && Q[(front + 2) % MAXSIZE] != f) {
Q[rear] = f;
rear = (rear + 1) % MAXSIZE;
front = (front + 1) % MAXSIZE;
}
}
cout << "输出:";
for (i = len - 1; i >= 0; i--) {
cout << Q[(front + i) % MAXSIZE] << " ";
}
cout << endl;
cout << "输入:";
}
}
void file2() {
int f = 0;
vector<fcb> F;
int i = 0, j = 0;
fcb temp;
int m = 0;
cout << "输入:";
while (cin >> f) {
for (i = 0; i < F.size(); i++) {
if (F[i].name == f) {
for (j = 0; j < F.size(); j++) {
if (j != i) {
F[j].time++;
}
}
F[i].time = 0;
break;
}
}
if (i == F.size() && F.size() < 3) {
for (j = 0; j < F.size(); j++) {
F[j].time++;
}
temp.name = f;
temp.time = 0;
F.push_back(temp);
}
else if (i == F.size() && F.size() >= 3) {
m = 0;
for (j = 1; j < F.size(); j++) {
if (F[j].time > F[m].time) {
m = j;
}
}
F.erase(F.begin() + m);
for (j = 0; j < F.size(); j++) {
F[j].time++;
}
temp.name = f;
temp.time = 0;
F.push_back(temp);
}
sort(F.begin(), F.end(), cmp);
cout << "输出:";
for (i = 0; i < F.size(); i++) {
cout << F[i].name << ends;
}
cout << endl;
cout << "输入:";
}
}
int main() {
//file();
file2();
return 0;
}
字符串处理
#include "pch.h"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef struct student {
int id;
string name;
char sex;
string age;
student():id(0),name(""),sex('f'),age(""){}
}Stu;
bool my_cmp(Stu a, Stu b)
{
return a.id < b.id;
}
int trans(string s)
{
int num = 0;
for (int i = 0; i < s.size(); i++) {
num *= 10;
num += s[i] - '0';
}
return num;
}
int main()
{
vector<Stu> stu;
Stu temp;
temp.id = 10;
temp.name = "wes";
temp.sex = 'f';
temp.age = "23";
stu.push_back(temp);
temp.id = 20;
temp.name = "ert";
temp.sex = 'f';
temp.age = "45";
stu.push_back(temp);
temp.id = 30;
temp.name = "str";
temp.sex = 't';
temp.age = "89";
stu.push_back(temp);
string m;
int i = 0, j = 0;
int ID = 0;
while (cin >> m) {
if (m[0] == 'I') {
for (i = 1; m[i] != ','; i++);
temp.id = trans(m.substr(1, i - 1));
//cout << m.substr(1, i - 1) << endl;
j = ++i;
for (; m[i] != ','; i++);
temp.name = m.substr(j, i - j);
//cout << m.substr(j, i - j) << endl;
j = ++i;
temp.sex = m[j];
//cout << m[j] << endl;
i += 2;
temp.age = m.substr(i, m.size() - i);
//cout << m.substr(i, m.size() - i) << endl;
stu.push_back(temp);
sort(stu.begin(), stu.end(), my_cmp);
for (i = 0; i < stu.size(); i++) {
if (i) {
cout << ',';
}
cout << '(' << stu[i].id << ',' << stu[i].name << ',' << stu[i].sex << ',' << stu[i].age << ')';
}
cout << endl;
}
else if (m[0] == 'D') {
ID = trans(m.substr(1, m.size() - 1));
for (i = 0; i < stu.size(); i++) {
if (stu[i].id == ID) {
stu.erase(stu.begin() + i);
}
}
sort(stu.begin(), stu.end(), my_cmp);
for (i = 0; i < stu.size(); i++) {
if (i) {
cout << ',';
}
cout << '(' << stu[i].id << ',' << stu[i].name << ',' << stu[i].sex << ',' << stu[i].age << ')';
}
cout << endl;
}
}
return 0;
}
根据一棵树的中序遍历与后序遍历构造二叉树
中序遍历:先左子树,后根节点,再右子树
后序遍历:先左子树,后右子树,再根节点
#include "pch.h"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
//解题主函数
void m() {
vector<char> in;
vector<char> post;
string inorder, postorder;
int i = 0;
TreeNode* root;
cout << "输入(按后序,中序):";
cin >> postorder >> inorder;
for (i = 0; i < inorder.size(); i++) {
in.push_back(inorder[i]);
}
for (i = 0; i < postorder.size(); i++) {
post.push_back(postorder[i]);
}
root = buildTree(in, post);
pre(root);
}
//先序遍历建立的二叉树
void pre(TreeNode* root) {
if (root == NULL)
return;
cout << root->val;
pre(root->left);
pre(root->right);
}
//建立二叉树
TreeNode* buildTree(vector<char>& inorder, vector<char>& postorder) {
return pre_order(0, inorder.size() - 1, 0, inorder.size() - 1, inorder, postorder);
}
//建立二叉树,递归
TreeNode *pre_order(int leftin, int rightin, int leftpost, int rightpost, vector<char> &in, vector<char> &post) {
int rootin = 0;
int left = 0;
if (leftin > rightin)
return NULL;
TreeNode *root = new TreeNode(post[rightpost]);
rootin = leftin;
while (rootin <= rightin && in[rootin] != post[rightpost])
rootin++;
left = rootin - leftin;
root->left = pre_order(leftin, rootin - 1, leftpost, leftpost + left - 1, in, post);
root->right = pre_order(rootin + 1, rightin, leftpost + left, rightpost - 1, in, post);
return root;
}
};
int main()
{
Solution s;
s.m();
return 0;
}
#include "pch.h"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
string a, b;
void f(int ab, int ae, int bb, int be) {
int i = 0;
if (ab > ae)
return;
cout << a[ae];
for (i = bb; i <= be && b[i] != a[ae]; i++);
f(ab, ab + i - bb - 1, bb, i - 1);
f(ab + i - bb, ae - 1, i + 1, be);
}
int main()
{
cin >> a >> b;
f(0, a.size() - 1, 0, b.size() - 1);
return 0;
}