Java——接口的学习

今天继续填坑,讲一下接口。说起接口,其实我们可以把它当做一种特殊的抽象类,接口中有着抽象方法。但不同于类的是,它可以存在一个类有多个接口。接下来,我用一个例子形象的描述一下接口。例如,有两个抽象类:Animal和Fruit,其中Fruit的子类均可以食用,而Animal中存在一些子类(Tiger)不能被食用。如果我们要构建一下howToEat()方法,按照上一次我们讲的多态知识,我们会在抽象类Animal和Fruit中构造howToEat方法,然后被子类所继承。但是这就带来一个问题,由于子类必须强制重写
分类: 其他 发布时间: 01-24 22:37 阅读次数: 0

C++编程小技巧(纯干货)

(1)当出现连续无限次输入的时候,可以使用下列表达式while(cin>>x){....}(2) 当想判断下次输入的值,可以采用下列表达式cin>>X>>y;while(x!=0 && y!=0){ ...... cin>>x>>y; //再次输入非常重要}...
分类: 其他 发布时间: 01-24 22:37 阅读次数: 0

C++算法——排序和搜索

今天我们来说一下图的存储和算法。
分类: 其他 发布时间: 01-24 22:37 阅读次数: 0

C++算法——高精度运算

(1)高精度加法// C = A + B, A >= 0, B >= 0vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for (int i = 0; i < A.size(); i ++ )
分类: 其他 发布时间: 01-24 22:36 阅读次数: 0

C++算法——差分

先看看差分函数void insert( int l , int r , int c ){ s[l] += c; s[ r + 1] -= c;}差分其实是前缀和的升级版,举个简单的例子操作就是利用前缀和,将目标范围内的数进行累加。我们来看一道例题。#include<iostream>using namespace std;const int N = 1e7 + 10;int q[N], s[N];void insert( int l , int r , in
分类: 其他 发布时间: 01-24 22:36 阅读次数: 0

C++算法——离散化

离散化的本质,是映射,将间隔很大的点,映射到相邻的数组元素中。减少对空间的需求,也减少计算量。其实映射最大的难点是前后的映射关系,如何能够将不连续的点映射到连续的数组的下标。此处的解决办法就是开辟额外的数组存放原来的数组下标,或者说下标标志,本文是原来上的数轴上的非连续点的横坐标。此处的做法是是对原来的数轴下标进行排序,再去重,为什么要去重呢,因为本题提前考虑了前缀和的思想,其实很简单,就是我们需要求出的区间内的和的两端断点不一定有元素,提前加如需要求前缀和的两个端点,有利于我们进行二分搜索,其实二分搜
分类: 其他 发布时间: 01-24 22:36 阅读次数: 0

C++算法——动态规划之——01背包问题

(1)01背包问题博客讲解原理:https://blog.csdn.net/qq_38410730/article/details/81667885?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160032924519725250312737%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=1600329245197252503127
分类: 其他 发布时间: 01-24 22:35 阅读次数: 0

动态规划——区间dp

区间dp是dp问题中非常常见的类型,主要涉及类似于小船渡河,石子合并以及多个矩阵连乘等问题。解决方法也比较固定,先从dp的思想开始说起。dp的灵魂就是累计从小问题的最优解通过某种递归关系,一步步求得大问题的最优解。有点类似递归中归的过程。这里举一个石子合并的例子,先看题目。我们遇到dp问题,先想怎么进行状态表示。我们先用a [N] 数组来装这些石头的重量,如a [i]表示第i个石头的重量。这里我们用一个二维数组 f [i][j] ,表示第 i 个石头到第 j 个石头合并后的最小代价。好了,现在就该推
分类: 其他 发布时间: 01-24 22:35 阅读次数: 0

动态规划——线性DP

线性DP相对于其他DP,思路清晰,只要想好递推式以及边界问题,问题大多数迎刃而解。空说无益,先来看看一道经典例题感受一下8。题目大概意思就是给定两个字符串,求出字符串 a[ ] 变成 b[ ] 的最小操作数。其中题目给定了三种操作方式:(1)删除操作,比如当 a[ 1 — i - 1 ]的字符与 b[ 1 — j ] 已经匹配好了,我们看向 a[i] ,如果此时若继续 a[ 1 — i ] 与 b[ 1 — j ]匹配,则执行删除操作,即删除 a[i](2)添加操作,当 a[ 1 — i ]已经
分类: 其他 发布时间: 01-24 22:35 阅读次数: 0

Python学习(2)——字符的处理

先来看看一些基础的函数 a = "AbCdeFG" #这两个函数负责把字符全部变成大写和小写 print( a.lower() + " " + a.upper()) #split函数将字符串按特定的符号切开 print( "a,b,c".split(",") ) #cout函数返回子串在主串的个数 print("an apple a day".count("a") ) #replace函数替换主串的字符 print("python".replac
分类: 其他 发布时间: 01-24 22:34 阅读次数: 0

动态规划——状态压缩DP——蒙德里安的梦想

状态压缩DP是我现阶段学的比较难的DP问题,其主要思想就是利用一个数来表示一种状态(通常使用二进制来表示)。我们先来看一下题目。根据做DP题的步骤,先进行状态表示。这里非常巧妙,我们设立一个 f[N][M] 的数组,其中 M 为 2^n 次方。f[i][j] 表示 i-1列的方案数已经确定,从i-1列伸出,并且第i列的状态是j的所有方案数。举个简单的例子,比如我们有5行,则我们用二进制表示5行中的空格和填充部分(0表示空格,1表示填充),则有 00000 , 00001 , 00100 … 。至于为什
分类: 其他 发布时间: 01-24 22:34 阅读次数: 0

贪心算法——区间合并以及覆盖问题

贪心算法的核心在于,只是注意当前的最优解情况,每次依次选择最优解,使得最终问题得到最优解。一般来说,贪心算法只能解决单峰问题。我们先来看一下题目。
分类: 其他 发布时间: 01-24 22:34 阅读次数: 0

C++算法——DFS

DFS我们称之为深搜,通常解决一些最大最长或者所有可能的问题,一般用递归来实现。因为深搜基本上会遍历每一个结果,但暴力法不同在于,深搜可以通过递归中不满足条件,实现剪枝。我们先来看一道例题,感受一下深搜。思路其实比较简单,有点类似于穷举法。我们构建一棵数,每一层依次增加一个没有枚举的数,当到达底层的时候就是一个答案。比如我们先将第一个数填1,然后由于还有数未填入,继续深入到达下一层。下一层由于第一个数1已经枚举,我们枚举第二个数2。然后继续进入第三层,枚举第三个数3,由于已经把所有的数都枚举完,我
分类: 其他 发布时间: 01-24 22:34 阅读次数: 0

C++算法——BFS

BFS我们称之为宽搜,通常可以用于解决最短,最小问题。不同于深搜,宽搜每次先把同一层的遍历一遍,若无正确答案再去遍历下一层,因此不需要用到递归,只需要用到循环即可。先来看一道经典例题:走迷宫解决走迷宫问题,我们可以用程序来模拟一下走迷宫,但不同人走迷宫,我们通过程序可以在一个位置从上下左右去尝试,直到找到正确答案。解决走迷宫问题,我们可以用程序来模拟一下走迷宫,但不同人走迷宫,我们通过程序可以在一个位置从上下左右去尝试,直到找到正确答案。但前提是向该方向走一步后,到达的点是否合法,因此要进行判断
分类: 其他 发布时间: 01-24 22:33 阅读次数: 0

C++Trie——最大异或数

Trie树其实就是将字符串或一串东西存储在一棵树上。举个栗子。假如我们存入了两串字符。会发现我们存储在这个树,其实有很多好处。Trie树最多的两个操作就是插入和查询。先来说说插入的好处,这里先上一道经典例题。我们这里是通过一个数组son[ ]来维护这棵树。这里我们用idx这个索引来标记,具体用途看下面代码。int cnt[N] , son[N][26];//idx相当于一个指引,如果没有到达最后的字符,那么就引导到第idx行//如果已经到达最后一个字符,那么久引导到cnt[idx],记录该字
分类: 其他 发布时间: 01-24 22:33 阅读次数: 0

C++并查集——食物链

并查集是一种用来维护集合的简单算法。因为其实现算法很简单,经常用于面试题。其实现原理是构造一棵树,其中在一个集合的元素都会储存在一棵树中。如果两个集合合并,可以将集合A放在集合B的节点,达到两个集合合并后所有元素的根节点都为同一个值即可。算法关键是构建一个函数find(),该函数用来找出该点的根节点的值。如果将A点加入到集合B中,只需将A点的根节点值修改成B集合根节点的值即可。#include<iostream>using namespace std;const int N
分类: 其他 发布时间: 01-24 22:33 阅读次数: 0

爬虫总结——(1)request使用以及文件存储

爬虫的基本概念就是通过程序来模拟上网冲浪,通过获取整个页面的所有信息,然后用正则表达式或者bs4进行解析,部分获取信息。在python中,爬虫的很多模块已经构建好了。先来看几个最基本的概念。url:通俗来说就是要爬取的页面,但由于有些网页是动态加载的,里面的数据不一定是由显示的网址加载的,具体得看该数据的urlUA伪装:我们都基本上使用浏览器来浏览网页,UA就相当于一个浏览器的代号,有些服务器为了防止恶意爬虫,如果不使用UA伪装,会无法爬取该网站的数据数据类型:如:text , json 和 co
分类: 其他 发布时间: 01-24 22:33 阅读次数: 0

爬虫总结——(2)页面信息解析

很多时候,我们爬取了一整张页面后,我们只会截取一部分的内容。比如我可能只要页面某个栏目的图片,或者只要文章的开头。通过看网页的html内容,我们可以发现,其实其结构属于层层包含,而我们所需要的通常在,某个class或者div的目录下。因此我们就可以使用正则表达式,bs4或者xpath。先来看一下正则。正则涉及到正则表达式。大家可以来练习一下正则。#提取python key = "javapythonc++php" print( re.findall('python' , key)[0
分类: 其他 发布时间: 01-24 22:32 阅读次数: 0

Scrapy框架的个人理解和总结

Scrapy作为一个强大的爬虫框架,具有强大的爬取网站和信息传输能力。Scrapy框架主要是分目录的形式,逐层对信息进行爬取。网页的目录一般分为三个。以中国新闻网为例子:https://www.chinanews.com/在新闻网的首页中,我们看到有这样的一栏。这就是一级目录。通过网页解析器,我们发现这个ul标签下麦呢有很多的li标签,而li中包含的a标签中的href属性就是对应着某个类别新闻的列表。我们随便跳转一个href,就进入了第二目录。这个网站的二级目录是属于动态网页,具体爬取的时候要
分类: 其他 发布时间: 01-24 22:32 阅读次数: 0

Linux常用命令学习(1)

这个寒假打算学习Linux操作系统,这个博客系列将记载我学习的过程的心得。第一篇博客讲一下Linux对于文件和目录最基本的操作。这是我在b站学习的视频资料:https://www.bilibili.com/video/BV1mW411i7Qf?t=1862&p=13首先是显示列表的命令:lsls / 查询指定目录的文件(这里是根目录)ls -a 显示所有文件(包括隐藏文件) 记忆方法:all-ls -ld 查看目录属性 记忆方法:directoryls -l 长格
分类: 其他 发布时间: 01-24 22:32 阅读次数: 0