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

报文:https://blog.csdn.net/ailunlee/article/details/90600174