该题解只能当参考!
第一大题:
第一题:
一个算法应该具有以下五个重要的特征:
1,有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止;
2,确切性(Definiteness):算法的每一步骤必须有确切的定义;
3,输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
4,输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
5,可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。
第二题:
算法的复杂度包括算法的时间复杂度及空间复杂度。这两个复杂度可以互相影响的。比如,可以采用“用空间换时间”的方法用多消耗内存空间来降低程序运行时间,也可以用“时间换空间”的方法,多消耗程序运行时间来降低内存占用空间。
第三题:
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。
宽度优先搜索的核心思想是:从初始结点开始,应用算符生成第一层结点,检查目标结点是否在这些后继结点中,若没有,再用产生式规则将所有第一层的结点逐一扩展,得到第二层结点,并逐一检查第二层结点中是否包含目标结点。若没有,再用算符逐一扩展第二层所有结点……,如此依次扩展,直到发现目标结点为止 。
第四题:
数据的逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据。它与数据的存储无关,是独立于计算机的。数据的逻辑结构分为线性结构和非线性结构,线性表是典型的线性结构;集合、树和图是典型的非线性结构。
存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构。它包括数据元素的表示和关系的表示。数据的存储结构是逻辑结构用计算机语言的实现,它依赖于计算机语言。数据的存储结构主要有:顺序存储、链式存储、索引存储和散列存储。
第五题:
什么是多态?
概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。
为什么要用多态呢?
原因:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。
第二大题:
第一题:
思路:循环一半判断正向和倒数的是否相同即可
#include <iostream>
using namespace std;
const int maxn = 1e5 + 9;
int a[maxn];
int main() {
int n;
scanf("%d", &n);
int r = 0;
while (n) {
a[r] = n % 10;
n /= 10;
r++;
}
int flag = 0;
for (int i = 0; i < r / 2; ++i) {
if (a[i] != a[r - 1 - i]) {
flag = 1;
break;
}
}
if (flag) {
printf("不回文\n");
} else {
printf("回文\n");
}
return 0;
}
第二题:
思路:括号匹配经典问题,用栈解决即可。
#include <iostream>
#include <stack>
using namespace std;
int main() {
string s;
cin >> s;
stack<char>A;
int flag = 0;
for (int i = 0; i < s.length(); ++i) {
if (s[i] == '[' || s[i] == '{' || s[i] == '(') {
A.push(s[i]);
} else if (s[i] == ']' && A.top() == '[') {
A.pop();
} else if (s[i] == '}' && A.top() == '{') {
A.pop();
} else if (s[i] == ')' && A.top() == '(') {
A.pop();
} else {
flag = 1;
break;
}
}
if (flag || A.size() != 0) {
printf("匹配无效\n");
} else {
printf("匹配有效\n");
}
return 0;
}
第三题:
思路:没看懂题目意思,二进制枚举一下?或者只是简单循环搞定?
我的思路是首先判断可能的所有数,然后二进制枚举遍历用不用这个数,然后看看最后得到的最小的答案即可。
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e3 + 9;
int a[maxn];
int main() {
int n;
scanf("%d", &n);
if (n == 0) {
printf("0\n");
return 0;
} else if (n < 0) {
return 0;
}//判断错误
int r = 0;
for (int i = 1; i * i <= n; ++i) {
a[r] = i * i;
r++;
}//假设r=4
int min1 = inf;//将答案设为最大
for (int i = 1; i < 1 << r; ++i) { //遍历二进制1到10000
int now = i;
int sum = 0;
int ans = 0;
for (int j = 0; j < r; ++j) {
if ((1 << j) & now) { //查询选择的是哪个数
sum += a[j];//让sum加上
ans++;
}
}
if (sum == n) {
min1 = min(min1, ans);
}
}//二进制枚举
printf("%d\n", min1);
return 0;
}
第四题:
思路:造一个判断函数和主函数循环即可。
#include<iostream>
#include<vector>
using namespace std;
vector<int>sum;
int ans(int x) {
if(x % 3 == 0 && x % 5 == 0) {
return 1;
}
else {
return 0;
}
}
int main() {
for(int i = 1;i <= 100;++i) {
if(ans(i)) {
sum.push_back(i);
}
}
for(int i = 0;i < sum.size();++i) {
cout << sum[i] << ' ';
}
putchar('\n');
return 0;
}
第五题;没啥好说的考察面向对象
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
class vehicle{
public:
int wheels;
int weight;
int get_wheels() {
return wheels;
}
void set_wheels(int value) {
wheels = value;
}
int get_weight() {
return weight;
}
void set_weight(int value) {
weight = value;
}
};
class car : public vehicle{
public :
int passenger_load;
int get_passenger_load() {
return passenger_load;
}
void set_passenger_load(int value) {
passenger_load = value;
}
};
int main() {
car car1;
car1.set_wheels(1);
car1.set_weight(2);
car1.set_passenger_load(3);
printf("%d %d %d\n", car1.get_weight(), car1.get_wheels(), car1.get_passenger_load());
return 0;
}
第六题:
循环判断即可
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
int main() {
int sum_zheng = 0 , sum_zero = 0, sum_fu = 0;
for(int i = 1;i <= 50;++i) {
int h;
scanf("%d", &h);
if(h > 0) {
sum_zheng++;
}
else if(h == 0) {
sum_zero++;
}
else {
sum_fu++;
}
printf("正数%d 零%d 负数%d\n", sum_zheng, sum_zero, sum_fu);
}
return 0;
}