算法与数据结构学习笔记:二分法
二分搜索模板给一个有序数组和目标值,找第一次/最后一次/任何一次出现的索引,如果没有出现返回-1 模板四点要素 1、初始化:start=0、end=len-1 2、循环退出条件:start + 1 < end 3、比较中点和目标值:A[mid] ==、 <、> target 4、判断最后两个元素是否符合:A[start]、A[end] ? target 注意:为了防止overflow,超过int范围,左中位数(a+b)=a+(b-a)/2,右中位数(a+b)=a+(b-a+1)/2如果有mid*mid,mid用int注意溢出 时间复杂度 O(logn),使用场景一般是有序数组的查找 典型示例 704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 class Solution { public: int search(vector<int>& nums, int target) { ...
算法与数据结构学习笔记:动态规划
线性 DP最经典单串300. 最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 class Solution { public: int lengthOfLIS(vector<int>& nums) { int maxLength=0; vector<int> dp(nums.size(),1); for(int i=0;i<nums.size();i++) { for(int j=0;j<i;j++) { if(nums[i]>nums[j]&&dp[i]<(dp[j]+1)) { dp[i]=dp[j]+1; ...
算法与数据结构学习笔记:栈和队列
简介栈的特点是后入先出,根据这个特点可以临时保存一些数据,之后用到依次再弹出来,常用于 DFS 深度搜索 队列一般常用于 BFS 广度搜索,类似一层一层的搜索 栈155. 最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。 辅助栈class MinStack { public: /** initialize your data structure here. */ stack<int> minStack; stack<int> dataStack; MinStack() { minStack.push(INT_MAX); } void push(int x) { dataStack.push(x); minStack.push(min(minS ...
算法与数据结构学习笔记:二进制
常见二进制操作C++位运算符下表显示了 C++ 支持的位运算符。 假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示: A = 0011 1100 B = 0000 1101 则: 运算符 描述 实例 & 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 (A & B) 将得到 12,即为 0000 1100 | 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 (A | B) 将得到 61,即为 0011 1101 ^ 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 (A ^ B) 将得到 49,即为 0011 0001 ~ 二进制补码运算符是一元运算符,具有”翻转”位效果,即0变成1,1变成0。 (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 << 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2 将得到 240,即为 1111 0000 >& ...
Java学习笔记-基础篇
Java程序怎么样运行的Java 程序从源代码到运行一般有下面 3 步:我们需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。 HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 ...
算法与数据结构学习笔记:二叉树
知识点二叉树遍历前序遍历:先访问根节点,再前序遍历左子树,再前序遍历右子树 中序遍历:先中序遍历左子树,再访问根节点,再中序遍历右子树 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问根节点 注意点 以根访问顺序决定是什么遍历 左子树都是优先右子树 前序遍历例题:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ 递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> ans; vector<int> preorderTraversal(TreeNode* ...
Rest Client在idea的使用
1.安装首先,打开IntelliJ IDEA或pycharm,安装Rest Client。 File -> Setting -> Plug-ins -> Browse Repository 搜索Rest Client,点击右侧的install,稍等片刻会提醒要重启IDEA,重启后安装结束。 2.使用使用时候,从顶层工具栏依次Tools -> HTTP Client -> Test RESTFUL Web Service 打开 之后,IDEA REST Client控制台的界面如下样子。 这个控制台展示的功能区有请求方式,请求参数和请求头的填充等等。 如果需要用户名、密码验证,点击右侧按钮,会弹出填充用户名和密码的窗口。 填完后会自动补充到Authorization 的header里面去。 Rest Client插件会自动将最近执行的50个请求保存到http-requests-log.http 文件中。 该文件存储在项目的.idea /httpRequests/目录下。 使用请求历史记录,用户可以快速导航到特定响应并再次发出请求。 除了构建请求,发起R ...
算法与数据结构学习笔记:链表
核心知识点 null异常处理 dummy node 哑巴节点 双指针/快慢指针 插入一个节点到排序链表 从一个链表中移除一个节点 翻转链表 合并两个链表 找到链表的中间节点 例题:83. 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2输出: 1->2示例 2: 输入: 1->1->2->3->3输出: 1->2->3 直接法:链表是有序的,所以直接更改当前结点的 next 指针,跳过下一个结点并直接指向下一个结点之后的结点即可。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* deleteDup ...
记一次CVE-2018-0802漏洞的简单利用
受影响的版本 Microsoft Office 2007 Service Pack 3 Microsoft Office 2010 Service Pack 2 (32-bit editions) Microsoft Office 2010 Service Pack 2 (64-bit editions) Microsoft Office 2013 Service Pack 1 (32-bit editions) Microsoft Office 2013 Service Pack 1 (64-bit editions) Microsoft Office 2016 (32-bit edition) Microsoft Office 2016 (64-bit edition) Microsoft Office 2016 Click-to-Run (C2R) for 32-bit editions Microsoft Office 2016 Click-to-Run (C2R) for 64-bit editions Microsoft Office Compatibility Pack ...
使用vscode快速搭建单片机开发环境
摘要:本文主要介绍了如何搭建以Visual Studio Code 和 PlatformIO为基础的单片机开发环境,并以esp8266开发板为例,通过在OLED显示屏上显示文字的一个例子介绍如何开发一个单片机程序。 本文主要使用的环境: 单片机开发板:Esp8266(CH340G) Visual Studio Code:1.45.1 PlatformIO:Core 4.3.4 Home 3.2.2 U8g2:2.28.6 一、硬件部分首先就是去某宝买一个esp8266开发板和显示屏,这里我买的是这个(不贴链接,不然有打广告嫌疑,自己去搜哈,有些卖家不送杜邦线的,可以提前问问) 按照卖家的说明将显示屏和开发板连接好 二、软件部分1. 安装Visual Studio Code 和 PlatformIOvscode: https://code.visualstudio.com/ 安装完成vscode启动,扩展页面下搜索platformio即可找到,选择第一个Platformio IDE,安装即可(这里需要耐心等待一会) 安装完成,等待vscode重新加载后,左下角会多一 ...
永恒之蓝漏洞的简单利用
前言: 永恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers(影子经纪人)公布一大批网络攻击工具,其中包含“永恒之蓝”工具,“永恒之蓝”利用Windows系统的SMB漏洞可以获取系统最高权限。5月12日,不法分子通过改造“永恒之蓝”制作了wannacry勒索病毒,英国、俄罗斯、整个欧洲以及中国国内多个高校校内网、大型企业内网和政府机构专网中招,被勒索支付高额赎金才能解密恢复文件。 详见Microsoft 安全公告:MS17-010 :https://docs.microsoft.com/zh-cn/security-updates/securitybulletins/2017/ms17-010 恶意代码会扫描开放445文件共享端口的Windows机器,无需用户任何操作,只要开机上网,不法分子就能在电脑和服务器中植入勒索软件、远程控制木马、虚拟货币挖矿机等恶意程序。 本文主要利用“永恒之蓝”漏洞(Microsoft 安全公告:MS17-010)对目标靶机进行攻击并拿到远程执行的权限,并通过获取远程靶机上的文件的例子讲解此漏洞的危害,提高大家的安全意识。 本文为科普性 ...
编写我的第一个Linux 内核模块“hello_module
前言: Linux 内 核 模 块 全 称 为 “ 动 态 可 加 载 内 核 模 块 (Loadable Kernel Module,LKM)”,是系统内核向外部提供的功能插口。作为宏内核结构,Linux 内核具有效率高的特点,但也有可扩展性和可维护性相对较差的不足,Linux 提供模块机制正是弥补这一缺陷。 模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。模块在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户控件的进程是不同的。模块通常有一组函数和数据结构组成,用来实现某种文件系统、驱动程序或其它内核上层功能。 本文将介绍如何编写一个简单的内核模块以及如何传递参数给此模块。 一、 编写一个简单的内核模块1.编写模块程序编写如下简单代码,本示例中代码文件命名“hello_module.c”。 //hello_module.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> static int __ ...