张雪峰推荐普通人考研考计算机相关专业,主要是因为计算机技术在现代社会中薪资水平相对较高。
另一方面,也是计算机专业在平时就学习了数据结构等课程,在招聘前冲刺复习的时候比像我这样的非科班选手要省下不少精力。
拿我经历过的阿里巴巴 C++ 后端一面来说,面试官考察了最基本的二叉树、链表等数据结构。算法题考了快速排序算法。如果在学校学过这两门课的话就能省下不少时间。
虽然现在互联网行业的就业情况也是越来越卷,尤其是大家经常调侃的 Java 。但是大家不要灰心,坚持学习进步、相信会有合适的 offer 的。
免费下载 - MySQL和Oracle的详细区别
CSDN - 本博客C++入门笔记快捷下载
今天的剑指 offer 带来和我的阿里巴巴一面相同的快排:
剑指 offer 题目:
题号:LCR 159
仓库管理员以数组 stock
形式记录商品库存表,其中 stock[i]
表示对应商品库存余量。请返回库存余量最少的 cnt
个商品余量,返回 顺序不限。
剑指 offer 解题思路:
思路一:快速排序
-
快速排序是一种分治算法,通过选择一个“基准”元素(pivot),将数组分成两个子数组,一个子数组中的所有元素都小于或等于基准元素,另一个子数组中的所有元素都大于基准元素。
-
然后递归地对这两个子数组进行快速排序。
-
通过两个指针
i
和j
从数组的两端向中间遍历,并根据基准元素重新排列数组,使得基准元素最终位于其正确的位置上,且左侧元素均不大于基准,右侧元素均不小于基准。
-
最后递归地对基准元素的左侧和右侧子数组进行排序。
时间复杂度:O(log N)
空间复杂度:O(log N)
C++
// C++
class Solution {
void qucikSort(vector<int>& stock, int left, int right) {
if(left >= right) {
return;
}
int i = left, j = right;
while(i < j) {
while(i < j && stock[j] >= stock[left]) j--;
while(i < j && stock[i] <= stock[left]) i++;
swap(stock[i], stock[j]);
}
swap(stock[i], stock[left]);
qucikSort(stock, left, i - 1);
qucikSort(stock, i + 1, right);
}
public:
vector<int> inventoryManagement(vector<int>& stock, int cnt) {
qucikSort(stock, 0, stock.size() - 1);
vector<int> answer;
answer.assign(stock.begin(), stock.begin() + cnt);
return answer;
}
};
go
// go
func inventoryManagement(stock []int, cnt int) []int {
quickSort(stock, 0, len(stock)-1)
return stock[:cnt]
}
func quickSort(stock []int, left, right int) {
if left >= right {
return
}
i, j := left, right
pivot := stock[left]
for i < j {
for i < j && stock[j] >= pivot {
j--
}
for i < j && stock[i] <= pivot {
i++
}
stock[i], stock[j] = stock[j], stock[i]
}
stock[i], stock[left] = stock[left], stock[i]
quickSort(stock, left, i-1)
quickSort(stock, i+1, right)
}