本篇大概分两部分,一部分是刷八股文,一部分是应试进度。本文不定时更新。就我找summer的体验来看,找工作真的非常痛苦,一方面是因为我面试时很容易紧张+大脑空白,另一方面是我的开发能力确实也不咋地,但是算法研发又不是那么熟悉。
八股文
又要开始背八股文了,先背背看看吧。虽然我觉得被拷打很丢人,而且背八股文真的很死板很无趣,但是也没办法,找工作就是这样的。本文不定时更新,包含被拷打的问题以及自己平时不太会的问题。
链表环的入口点或交点
使用一个快指针和慢指针,其中快指针速度是慢指针的两倍,然后快指针和慢指针会相遇在环内。假设链表里开头到环入口点长度为A,相遇处距离环的入口点长度为B,环里还剩下C,则有
$$ A + B = A + n(B+C) + B $$
其中n为快指针转了n圈。此时有$A = n(B+C) - B = (n-1)(B+C) + C$。再搞一个head指针与慢指针一起走,它俩会相遇在环的入口点,因为head走了A,而慢指针走了A也就是转了n-1圈走了C,两者会相遇。
同理,问两个链表相交的点也一样。初始设两个指针分别指向两个链表的头,一起移动(如果到末尾了换成另一个链表的头),直到相交,两者会走在交点处走过同样的距离(A+C+B 与 B + C + A)。
快排与归并与堆排
void quicksort(int a[], int l, int r){
if(l < r){
int i = l, j = r, pivot = s[l];
while(i < j){
while(j > i && s[j] > pivot)j--;
if(j > i)s[i++] = s[j];
while(j > i && s[i] < pivot)i++;
if(j > i)s[j--] = s[i];
}
s[i] = pivot; //别忘了这句
quicksort(a, 0, i-1);
quicksort(a, i+1, r);
}
}
void mergesort(int a[], int l, int r){
if(l >= r)return;
int mid = (l + r) / 2; // l + (r - l) / 2 可以防止l + r过大溢出
mergesort(a, l, mid);
mergesort(a, mid+1, r);
merge(a, l, mid, r);
}
void merge(int a[], int l, int mid, int r){
int *temp = new int[r - l + 1];
int cur = 0;
int h1 = l, h2 = mid+1;
while(h1 <= mid && h2 <= r){
if(a[h1] < a[h2])temp[cur++] = a[h1++];
else temp[cur++] = a[h2++];
}
while(h1 <= mid)temp[cur++] = a[h1++];
while(h2 <= r)temp[cur++] = a[h2++];
for(int i = low; i <= r; i++){
a[i] = temp[i - low];
}
delete []temp;
}
void MaxHeap(int arr[], int now, int heap_size){
int left_son = now * 2+1, right_son = left_son + 1;
while(left_son < heap_size){
int largest = right_son < heap_size && arr[left_son] < arr[right_son] ? right_son : left_son;
if(vec[now] >= largest)return;
swap(arr[now], arr[largest]);
now = largest;
left_son = now * 2 + 1;
right_son = left_son + 1;
}
}
void HeapSort(int arr[], int n){
if(n < 2)return;
for(int i = (n - 1) / 2; i >= 0; i--){
MaxHeap(arr, i, n);
}
swap(arr[0], arr[--n]);
while(n){
MaxHeap(arr, 0, n);
swap(arr[0], arr[--n]);
}
}
单例模式
class Singleton {
public:
static Singleton& GetInstance() {
static Singleton instance;
return instance;
}
private:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton&) = default;
Singleton& operator=(const Singleton) = default;
};
def singleton(cls):
_instances = {}
def inner():
if cls not in _instances:
_instances[cls] = cls()
return _instances[cls]
return innter()
@singleton
class single(object):
def __init__(self):
pass
C++ 多线程交替打印
#include <iostream>
#include <thread>
std::mutex mtx;
std::condition_variable cv;
std::string flag("A");
void PrintA(){
while(True){
std::unique_lock<std::mutex> lck;
while(flag == "B"){
cv.wait(lck);
}
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "A" << std::endl;
flag = "B";
cv.notify_all();
}
}
void PrintB(){
while(True){
std::unique_lock<std::mutex> lck;
while(flag == "A"){
cv.wait(lck);
}
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "B" << std::endl;
flag = "A";
cv.notify_all();
}
}
int main(){
std::thread t1(PrintA);
std::thread t2(PrintB);
t1.join();
t2.join();
std::cin.get();
}
C++ 一个类只能在栈 或者 堆 上创建
class OnlyStack{
private:
void* operator new(size_t){}
void operator delete(void* ptr){}
public:
OnlyStack(){}
~OnlyStack(){}
};
class OnlyHeap{
protected:
OnlyHeap(){}
~OnlyHeap(){}
public:
static OnlyHeap* create(){
return new OnlyHeap();
}
void destroy(){
delete this;
}
};
并查集
vector<int> roots(n, 0);
int find(int k){
if(roots[k]==k)return k;
return roots[k]=find(roots[k]);
}
for(int i = 0; i < n; i++){
roots[i] = i;
}
// union x & y
roots[find(x)] = find(y);
秋招进度
已投:华为,小红书,快手,字节,百度,美团,腾讯
小红书(没有面试)
字节一面(8.24)
快手一面(8.22)(没消息)
阿里淘天一面(8.29)
美团一面(8.28)(凉)
腾讯一面(8.30)
字节二面(9.1)