1.包含2,3,5的因子的数称之为丑数,求第n个丑数
1 2 3 4 (2^2) 5 ...
这个没做好,其实是剑指offer的一道题,写题解吧
我们把现有的最大丑数记做M。现在我们来生成下一个丑数,该丑数肯定是前面某一个丑数乘以2、3或者5的结果。
我们首先考虑把已有的每个丑数乘以2。在乘以2的时候,能得到若干个结果小于或等于M的。由于我们是按照顺序生成的,小于或者等于M肯定已经在数组中了,我们不需再次考虑;我们还会得到若干个大于M的结果,但我们只需要第一个大于M的结果,因为我们希望丑数是按从小到大顺序生成的,其他更大的结果我们以后再说。我们把得到的第一个乘以2后大于M的结果,记为M2。
同样我们把已有的每一个丑数乘以3和5,能得到第一个大于M的结果M3和M5。那么下一个丑数应该是M2、M3和M5三个数的最小者。
int ugly[1000000];
int findUgly(int n){
int index2=0;
int index3=0;
int index5=0;
ugly[1]=1;
for(int i=2;i<=n;i++){
int temp=min(ugly[index2]*2,min(ugly[index3]*3,ugly[index5]*5));
if(temp==ugly[index2]*2)index2++;
if(temp==ugly[index3]*2)index3++;
if(temp==ugly[index5]*2)index5++;
ugly[i]=temp;
}
}原文链接:https://blog.csdn.net/leex_brave/article/details/51766194
2.https://leetcode-cn.com/problems/sliding-window-maximum/
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
我回答的不好,说了一个n*logk的算法,就是线段树查找范围最大值,哎,这个大学acm时遇到过啊,队友A 的。
单调队列,双向队列,
队列里始终保次队尾到队首是上升的,
把滑窗新加入的元素放队尾,如果队尾比他大,就踢了,直到队尾的比新的值大,加入新值,因为我又新又大,我得在队列的前面啊,每次离开窗口的那个值和队首比较,和队首一致,说明最大值走了,把队首的干掉,如果不相等,说明最大值还在窗口内,我直接把队首的最大值给到结果集就行了。
class Solution {
private:
deque<int>win;
public:
void win_push(int num){
while(!win.empty()&&win.back()<num){
win.pop_back();
}
win.push_back(num);
}
int win_max(){
return win.front();
}
void win_pop(int num){
if(!win.empty()&&win.front()==num){
win.pop_front();
}
}
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int len=nums.size();
vector<int> ans;
for(int i=0;i<len;i++){
if(i>=k-1){
win_push(nums[i]);
ans.push_back(win_max());
win_pop(nums[i-k+1]);
}else {
win_push(nums[i]);
}
}
return ans;
}
};
知识点,双向队列
// 头部增加元素
deq.push_front(4);
// 末尾添加元素
deq.push_back(5);
// 头部删除元素
deq.pop_front();
// 末尾删除元素
deq.pop_back();3.快排的时间复杂度
这个应该是第一个题
n x logn-n x n
当有序,升序? 是n x n
当有序,降序? 是n x n
4.二维码扫描完发生了哪些操作
二维码其实就是比普通http请求多了一个解析二维码的过程。
1.解析二维码为一个hppt协议地址
2.解析地址,将地址解析为ip地址,具体就是访问浏览器缓存,操作系统缓存,路由器缓存,然后找不到就去访问dns服务器
3.解析出ip地址, 没有port端口就使用默认的端口,客户端像服务器发送请求
4.服务器段接到请求会为请求建立套接字进程,socket(源ip,源端口,目的ip,目的端口,协议),进程会bind客户端的地址+port ,客户端的port是一个随机port
5.建立tcp连接,进行3次握手建立连接
6.客户端发送请求报文,报文由状态行(status line)、相应头部(headers)、空行(blank line)和响应数据(response body)4个部分组成,(报文会在客户端打包,一层一层)
7.服务器收到报文,分析请求,去内核请求资源(index.html),(详解https://blog.csdn.net/l1394049664/article/details/82313414)磁盘拿文件,放内存,通知web服务器,web服务器将数据等生成报文返回给客户端。
8.客户端解析html

京公网安备 11010502036488号