面试可能会用到的代码

1. TOPK问题

//思路一O(nlogn)
vector<int> topK(vector<int> input, int k) {
	sort(input.begin(), input.end());
	vector<int> res;
	for (int i = 1; i <= k; i++) res.push_back(input[input.size() - i]);
	return res;
}
//思路二O(n*k)
vector<int> topK(vector<int> input, int k) {
	vector<int> res;
	for (int i = 0; i < k; i++)
		for (int j = 0; j < input.size() - 1 - i; j++)
			if (input[j] > input[j + 1]) swap(input[j], input[j + 1]);
	for (int i = 1; i <= k; i++) res.push_back(input[input.size() - i]);
	return res;
}
//思路三O(nlog(k))
vector<int> topK(vector<int> input, int k) {
	priority_queue<int, vector<int>, greater<int>> min;
	vector<int> res;
	for (int i = 0; i < input.size(); i++) {
		min.push(input[i]);
		if (min.size() > k)min.pop();
	}
	while (!min.empty()) {
		res.push_back(min.top());
		min.pop();
	}
	return res;
}

2. 判断链表是否有环

bool HasCycle(ListNode* head) {
	if (!head || !head->next) return false;
	ListNode* first = head, * second = first->next;
	while (first && second) {
		if (first == second) return true;
		first = first->next;
		second = second->next;
		if (second)second = second->next;
	}
	return false;
}

3. 数组的全排列

vector<vector<int>> ans;
	vector<bool> st;
	vector<int> path;
	vector<vector<int>> permute(vector<int>& nums) {
		for (int i = 0; i < nums.size(); i++) st.push_back(false);
		dfs(nums, 0);
		return ans;
	}
	void dfs(vector<int>& nums, int u) {
		if (u == nums.size()) {
			ans.push_back(path);
			return;
		}
		for (int i = 0; i < nums.size(); i++) {
			if (!st[i]) {
				st[i] = true;
				path.push_back(nums[i]);
				dfs(nums, u + 1);
				st[i] = false;
				path.pop_back();
			}
		}
	}

4. 快速排序

void QuickSort(int q[], int l, int r) {
	if (l >= r) return;
	int i = l - 1, j = r + 1, x = q[l + r >> 1];
	while (i < j) {
		do i++; while (q[i] < x);
		do j--; while (q[j] > x);
		if (i < j) swap(q[i], q[j]);
	}
	QuickSort(q, l, j); QuickSort(q, j + 1, r);
}

5. 归并排序

void MergeSort(int q[], int l, int r) {
	if (l >= r) return;
	int temp[10010];
	int mid = l + r >> 1;
	MergeSort(q, l, mid);
	MergeSort(q, mid + 1, r);
	int i = l, j = mid + 1, k = 0;
	while (i <= mid && j <= r) {
		if (q[i] < q[j]) temp[k++] = q[i++];
		else temp[k++] = q[j++];
	}
	while (i <= mid) temp[k++] = q[i++];
	while (j <= r) temp[k++] = q[j++];
	for (int i = 0, j = l; j <= r;) q[j++] = temp[i++];
}

6. 堆排序

vector<int> topK(vector<int> input, int k) {
	priority_queue<int> min;
	vector<int> res;
	for (int i = 0; i < input.size(); i++) {
		min.push(input[i]);
		if (min.size() > k)min.pop();
	}
	while (!min.empty()) {
		res.push_back(min.top());
		min.pop();
	}
	return res;
}

7. 反转链表

ListNode* reverseList(ListNode* head) {
	ListNode* pre = nullptr;
	auto cur = head;
	while (cur) {
		auto next = cur->next;
		cur->next = pre;
		pre = cur;
		cur = next;
	}
	return pre
}

8. 归并链表

ListNode* MergeTwoList(ListNode* t1, ListNode* t2) {
	ListNode* dummy = new ListNode(0);
	ListNode* cur = dummy;
	while (t1 != NULL && t2 != NULL) {
		if (t1->val < t2->val) {
			cur->next = t1;
			t1 = t1->next;
		}
		else {
			cur->next = t2;
			t2 = t2->next;
		}
		cur = cur->next;
	}
	cur->next = (t1 != NULL ? t1: t2);
	return dummy->next;
}

9. 并查集

class UnionFind {
public:
	vector<int> father;
	UnionFind(int num) {//将连通域的父亲置为其下标
		for (int i = 0; i < num; i++)father.push_back(i);
	}
	int Find(int n) {//查找每个元素的当前连通域
		while (father[n] != n)n = father[n];
		return n;
	}
	void Union(int a, int b) {//将当前元素加入到连通域
		int fa = Find(a);
		int fb = Find(b);
		father[fb] = fa;
	}
	bool JudgeUnion(int a, int b) {//判断当前元素是否在同一个连通域
		int fa = Find(a);
		int fb = Find(b);
		bool res = fa == fb;
		father[fb] = fa;
		return res;
	}
};

10. 二叉树的公共祖先

struct TreeNode {
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
	TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
		if (!root) return NULL;
		if (root == p || root == q) return root;
		auto left = lowestCommonAncestor(root->left, p, q);
		auto right = lowestCommonAncestor(root->right, p, q);
		if (left && right)return root;
		if (left) return left;
		return right;
	}
};

11. 二叉树的遍历

struct TreeNode {
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
	vector<int> inorderTraversal(TreeNode* root) {//中序遍历
		vector<int> v;
		stack<TreeNode*> s;
		TreeNode* now = root;
		while (now || !s.empty());
		{
			while (now) {
				s.push(now);
				now = now->left;
			}
			if (!s.empty()) {
				now = s.top();
				s.pop();
				v.push_back(now->val);
				now = now->right;
			}
		}
		return v;
	}
};

12. N个骰子出现和为m的几率

const int N = 100;
int f[N][N * 6];

int main()
{
	int n, m;
	cin >> n >> m;
	f[0][0] = 1;
	for (int i = 1; i <= 10; i++)
		for (int j = i; j <= m; j++)//这里的J范围:当只有一个骰子的时候(1~6)两个骰子(2~12)...n个骰子(n~6n)
			for (int k = 1; k <= 6; k++)
				if (j - k >= 0)f[i][j] += f[i - 1][j - k];
	double p = f[n][m] / pow(6, n);
	cout << p;
	return 0;
}

13. 寻找两个链表相交的位置

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    auto p = headA, q = headB;
    while(p != q)
    {
        if(p) p = p->next;
        else p = headB;
        if(q) q = q->next;
        else q = headA;
    }
    return p;
}