工程师每日刷题 -4

文章目录

  • 1、深度学习
  • 2、算法与数据结构
    • 2.1、暴力解法
    • 2.2、滑动窗口法
  • 3、编程基础

1、深度学习

问题:CNN的本质和优势?

CNN 本质上是一个多层感知机 (MLP),其成功的原因关键在于它所采用的【稀疏连接】(局部感受)和【权值共享】的方式,一方面减少了的权值的数量使得网络易于优化,另一方面降低了过拟合的风险。

参考链接

2、算法与数据结构

题目链接
工程师每日刷题 -4_第1张图片

2.1、暴力解法

两个for循环,然后不断的寻找符合条件的子序列
c++

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
            sum = 0;
            for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
                sum += nums[j];
                if (sum >= s) { // 一旦发现子序列和超过了s,更新result
                    subLength = j - i + 1; // 取子序列的长度
                    result = result < subLength ? result : subLength;
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

python

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        l = len(nums)
        min_len = float('inf')
        
        for i in range(l):
            cur_sum = 0
            for j in range(i, l):
                cur_sum += nums[j]
                if cur_sum >= s:
                    min_len = min(min_len, j - i + 1)
                    break
        
        return min_len if min_len != float('inf') else 0

2.2、滑动窗口法

滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果


1、窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组
2、窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)
3、窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引)

c++

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0; // 滑动窗口数值之和
        int i = 0; // 滑动窗口起始位置
        int subLength = 0; // 滑动窗口的长度
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            // 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
            while (sum >= s) {
                subLength = (j - i + 1); // 取子序列的长度
                result = result < subLength ? result : subLength;
                sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

python

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        l = len(nums)
        left = 0
        right = 0
        min_len = float('inf')
        cur_sum = 0 #当前的累加值
        
        while right < l:
            cur_sum += nums[right]
            
            while cur_sum >= s: # 当前累加值大于目标值
                min_len = min(min_len, right - left + 1)
                cur_sum -= nums[left]
                left += 1
            
            right += 1
        
        return min_len if min_len != float('inf') else 0

3、编程基础

问题:哪些情况不能用虚函数?

共有五种函数不能声明为虚函数,即普通函数(非成员函数)、构造函数、内联函数、静态函数、友元函数。

1)普通函数为啥不能是虚函数?
原因:

多态是依托于类的,要声明的多态的函数前提必须是虚函数。

2)构造函数为啥不能是虚函数?
原因:

多态是依托于类的,多态的使用必须是在类创建以后,而构造函数是用来创建构造函数的,所以不行。

3)内联函数为啥不能是虚函数?
原因:

内联函数属于静态联编,即内联函数是在编译期间直接展开,可以减少函数调用的花销,即是编译阶段就确定调用哪个函数了。
虚函数是为了实现多态,而多态是属于动态联编,即是在运行时才确定调用哪一个函数。显然这两个是冲突的。

4)静态函数为啥不能使虚函数?
原因:

静态函数的存在时为了让所有类共享。可以在对象产生之前执行一些操作。与虚函数的作用不是一路的

5)友元函数为啥不能是虚函数?
原因:

C++不支持友元函数的继承,不能继承的函数指定不是虚函数

参考链接

你可能感兴趣的:(工程师每日刷题,python,人工智能,算法)