系列综述:
目的:本系列是个人整理为了秋招面试
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢!!!
【C++】秋招&实习面经汇总篇
点此到文末惊喜↩︎
//函数名:generateRandomVector
//函数功能描述:随机数组(样本)生成器
//函数参数:size 生成数组最大尺寸
// value 数组每个元素的最大值
//返回值: vector 生成的随机序列数组
//for test
vector<int> generateRandomVector(int size, int value) {
//time 函数返回从 1970 年 1 月 1 日午夜开始到现在逝去的秒数,因此每次运行程序时,它都将提供不同的种子值。
srand((int)time(NULL));//为随机数生成器产生随机种子
//分配随机大小的数组,产生随机数的范围公式number = (rand()%(maxValue - minValue +1)) + minValue;
vector<int> result(rand() % (size + 1));
for (int i = 0; i < result.size(); i++) {
result[i] = rand() % (value + 1);
}
return result;
}
//大样本测试
//函数名:main
//函数功能描述:大样本测试
//函数参数: size 生成数组最大尺寸
// value 数组每个元素的最大值
//返回值: vector 生成的数组
//for test
int main(){
auto test_time = 50000;//测试次数,设置比较大,排除特殊情况
auto size = 10;//生成数组最大尺寸
auto value = 30;//生成数组每个元素的最大值
auto if_accept = true;//方法是否正确标志位
for(auto i = 0; i < test_time; i++) {
//拷贝初始化,生成新的数组向量
vector<int> nums(generateRandomVector(size, value));
//生成两个临时数组拷贝
vector<int> nums1(nums);
vector<int> nums2(nums);
//绝对正确方法
sort(nums1.begin(), nums1.end());
//自己写的方法,想要测试的算法
Solution::reversePairs(nums2);
//判断两个向量是否相同,vector类已经重载了比较运算符,不用自己实现,不相同说明算法不正确
if(nums1 != nums2) {
if_accept = false;
//输出结果不相等的原始向量
for(auto c: nums) {
cout << c << " ";
}
break;
}
}
//输出结果
cout << (if_accept ? "nice!\n" : "false!\n");
}
bool BinarySearch(vector<int> vec, int target){
if (vec.size() == 0) return false;
int L = 0;
int R = vec.size()-1;
int mid = 0;
while (L < R) {
mid = L + ((R-L)>>1);
if (vec[mid] == target) {
return true;
} else if(vec[mid] > target) {
R = mid - 1;
} else {
L = mid + 1;
}
}
return vec[L] == target; // 最后L和R都指向同一个结果
}
110 ^ 011 = 101,无进位是指每一个位相加都不进位
0 ^ N = N
N ^ N = 0
:偶数个相同的数异或为0异或结果与顺序无关
a = a ^ b;
b = a ^ b;
a = a ^ b;
void PrintOddTimes(vector<int> vec) {
int eor = 0;
for (int i = 0; i < vec.size(); ++i) {
eor ^= vec[i]; // 出现偶数的都会被异或为0
}
cout << eor << endl;
}
N & ((~N) + 1)
public class no_04_题目4 {
public static void main(String[] args) {
//注意:因为通过eor最右侧的1为特征,a和b在此位上必不相同,故可以用这位来划分区间
int eor = 0;
int[] arr = {1,1,1,2,2,2,4,4,5,5,5,5,6,6,8,8,};
//1.数组所有数与其异或一次
for (int i:arr)
eor ^= i; // 最终eor = a ^ b;// 其中a和b为目标两个数
// 2.提取eor最右侧的1【也就是a与b的划分位】,因为a != b,所以异或必不为0
int rightOne = eor & (~eor + 1);
//3.准备变量onlyOne与数组中在rightOne位上是1的异或,得到a与b其中一个
int onlyOne = 0;
for (int i:arr)
if ((rightOne & i) != 0)
onlyOne ^= i;
//4.onlyOne 就是 其中一个,onlyOne ^ eor是另一个
System.out.println(onlyOne + " " + (onlyOne ^ eor));
}
}
点此跳转到首行↩︎