一、索英笔试
1.实现strcpy
1.char src[] = "Hello, World!";: 这里定义了一个字符数组。这个字符串 "Hello, World!" 的内容被直接存储在这个数组中,数组的大小由字符串的长度加上一个额外的位置用于存储字符串结束符'\0'自动确定。 例如,这个数组的大小为 13(12 个字符加上一个结束符)。 可以修改这个数组中的内容,因为它是在栈上分配的可修改的内存区域。
2. char* src = "Hello, World!";: 这里定义了一个字符指针,它指向一个字符串常量。这个字符串通常存储在只读的内存区域(如常量数据段)。 不能通过这个指针修改所指向的字符串内容,因为它指向的是常量。
1.第一个存到栈区,可以更改字符,第二个存到字符常量区,不可以改变其内容,指针指向字符常量区。
#include<iostream>
using namespace std;
char* strcpy_t(char* strDest, const char* strSrc) {
if (strSrc == nullptr) {
return nullptr;
}
while (*strSrc != '\0') {
*strDest = *strSrc;
strDest++;
strSrc++;
}
*strDest = '\0';
return strDest;
}
int main() {
char src[] = "Hello, World!";
char dest[20];
char* result = strcpy_t(dest, src);
if (result != nullptr) {
std::cout << "Copied string: " << dest << std::endl;
}
else {
std::cout << "Source string is null." << std::endl;
}
return 0;
}
2.改错题:
p是值传递,但是p的指向不会改变,str还是指向的空,并不会被分配内存 p只在GetMemory内部有效,所以在main中 str仍为空。
#include<iostream>
using namespace std;
void GetMemory(char* p) {
p = (char*)malloc(100);
}
int main() {
char* str = NULL;
GetMemory(str);
strcpy_s(str, 20, "hello world");
printf(str);
free(str); // 记得释放动态分配的内存
return 0;
}
3.#include<file.h>和#include"file.h"的区别
一、搜索路径不同
#include <file.h>: 编译器通常会在预定义的系统目录中搜索这个头文件。这些目录通常包含标准库头文件和系统提供的头文件。 例如,在大多数 C++ 实现中,<iostream>等标准库头文件就是通过这种方式包含的。
#include "file.h": 编译器首先会在当前源文件所在的目录中搜索这个头文件。 如果在当前目录中没有找到,它会接着在预定义的包含路径中搜索,但这个搜索路径通常与<>包含方式的搜索路径不同。通常用于包含用户自定义的头文件或者项目特定的头文件。
二、使用场景不同
<> 通常用于包含标准库头文件和系统头文件,因为这些头文件的位置是相对固定的,并且由编译器和开发环境预先配置好。
""通常用于包含用户自己编写的头文件或者项目中特定的头文件,这些头文件通常与当前源文件在同一个项目目录结构中。
二、极大极小搜索和α-β剪枝算法
1.极大极小搜索和 α-β 剪枝算法是在博弈论中用于寻找最优策略的常用算法。
假设我们在进行一个双人博弈游戏,比如五子棋。在每个回合,一方要选择一个行动,然后另一方做出回应。我们想要找到对于当前玩家来说最优的行动。 对于当前轮到做决策的玩家(称为极大层,比如我方),我们希望选择能使局面评估值最大化的行动。而对于对手(称为极小层,比如敌方),我们假设对手会选择使局面评估值最小化的行动。 通过递归地从当前局面向下探索可能的后续局面,并计算每个局面的评估值,最终回溯得到当前局面的最优决策。
而在极大极小搜索的过程中,可能会存在很多不必要的搜索。α-β 剪枝就是用来减少这种不必要的搜索,从而提高搜索效率。
α 表示极大层(我方)当前已知的最优下界,β 表示极小层(敌方)当前已知的最优上界。在博弈树中,也就是五子棋棋局中,我方肯定会选择对自己有益的(得分高的)落子,而敌方则会尽可能的让你的得分低
在极大层中,如果当前计算出的局面评估值大于等于 β,那么就不需要继续搜索这个分支了,因为敌方肯定不会选择让我方得到这么好的局面。
在极小层中,如果当前计算出的局面评估值小于等于 α,同样不需要继续搜索这个分支,因为我方肯定不会让敌方达到这么差的局面。
红色线代表递归顺序。所以如下图所示,当推出β为-1时,整个右侧的圈1就不需要再遍历了,因为在极小层 α大于贝塔(2>-1),我肯定会选择更有利的局面。 所以右侧剪枝。