自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(89)
  • 资源 (1)
  • 收藏
  • 关注

原创 Java简单实现线程池

一、线程池线程池是一种缓冲提高效率的技术。相当于一个池子,里面存放大量已经创建好的线程,当有一个任务需要处理时, 可以直接从池子里面取一个线程去执行它。 包括内存池,很多缓冲的技术都是采用这种技术。 其实理解起来很简答!为什么需要线程池,这种池的技术?1.1 减少开辟资源和销毁资源带来的损耗。开辟线程,申请内存(具体的可以看C语言中malloc底层实现原理),销毁线程、释放内存资源等一些操作都是有时间消耗的。因此一开始开辟大量的资源进行管理,需要使用时从池中取一个去使用, 使用完毕后再放回池中

2021-04-21 23:13:48 2306 2

原创 Java定时器简单实现

一、定时器       定时器相当于一个任务管理器。有些任务可能现在执行, 有些任务可能过1个小时,甚至很久才会执行。定时器就是对这些任务进行管理监视, 如果一个任务执行时间到了,定时器就会将这个任务执行。 保证所有的任务都会在合适的时间执行。       二、定时器的实现对于定时器的实现,我们可以划分为3个部分。1、 使用一个Task类描述每一个任务(里面包

2021-04-19 23:18:29 537

原创 Java练习代码(五)- 线程

package Java2021_4_8;import sun.util.resources.ms.CalendarData_ms_MY;/** * @Create with IntelliJ IDEA * @Description : * @Auther : HMW * @Date: 2021-04-08 * @Time: 22:14 **/public class test_thread { static class MyThread extends Thread {

2021-04-10 00:46:46 196

原创 Java练习代码(四)- 简单哈希表实现

package Java2021_4_4;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;/** * @Create with IntelliJ IDEA * @Description : * @Auther : HMW * @Date: 2021-04-05 * @Time: 12:12 **/public class HashMap { static class

2021-04-05 16:51:55 170

原创 Java练习代码(三)

Java排序算法测试代码package Java2021_3_27;import java.lang.reflect.GenericDeclaration;import java.util.Arrays;/** * @Create with IntelliJ IDEA * @Description : * @Auther : HMW * @Date: 2021-03-27 * @Time: 23:26 **/public class test_sort { //直插排序

2021-03-28 00:22:27 104

原创 Java练习代码(二)

写下今天的总结, Java二叉树的学习过程代码package Java20200319;import sun.text.normalizer.UCharacter;import java.nio.charset.StandardCharsets;import java.util.*;/** * @Create with IntelliJ IDEA * @Description : * @Auther : HMW * @Date: 2021-03-19 * @Time: 22:08

2021-03-21 23:13:17 120

原创 Java练习代码(一)

写下今天的总结, Java二叉树的学习过程代码package Java20200319;import sun.text.normalizer.UCharacter;import java.nio.charset.StandardCharsets;import java.util.*;/** * @Create with IntelliJ IDEA * @Description : * @Auther : HMW * @Date: 2021-03-19 * @Time: 22:08

2021-03-20 01:40:53 285

原创 LeetCode每日一题-对链表进行插入排序

对链表进行插入排序/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* insertionSortList(ListNode* head) {

2020-11-20 23:11:23 112

原创 LeetCode每日一题-移动零

移动零class Solution {public: void moveZeroes(vector<int>& nums) { //双指针做 left right - 时间复杂度为o(n) int left = 0, right = 0; while(left < nums.size() && right < nums.size()) { //left - 指向元素为0的

2020-11-20 21:06:15 96

原创 LeetCode每日一题-奇偶链表

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : va.

2020-11-13 21:26:26 160

原创 LeetCode每日一题-按奇偶排序数组 II

按奇偶排序数组 II给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。class Solution {public: vector<int> sortArrayByParityII(vector<int>& A) { //偷懒一点 - 创建辅助空间 // if(A.s

2020-11-12 23:03:56 174

原创 tcp非阻塞connect实现

引言:客户端connect接口, 代表着三次握手, 默认为阻塞模式, 在握手期间, 客户端程序只能处于等待状态, 不能处理其他的业务,其次,如果握手失败, 还会等connect计时器时间, 大约是在75s左右。一、阻塞connect存在的几大问题。1、阻塞期间不能处理其他业务。2、如果连接失败, 等待的时间过长。二、实现非阻塞connect的方法1、将创建sockfd设置为阻塞模式int old_option = fcntl(fd, F_GETFL);int new_optio.

2020-11-11 17:07:24 1493 1

原创 LeetCode-隐藏个人信息

隐藏个人信息给你一条个人信息字符串 S,它可能是一个 邮箱地址 ,也可能是一串 电话号码我们将隐藏它的隐私信息,通过如下规则:class Solution {public: //邮箱处理函数 string MailToString(const string& str) { //1、首先获取第一组到第一个和最后一个字符 size_t pos = str.find('@'); size_t pos1 = str.fi

2020-11-10 17:45:01 305

原创 LeetCode每日一题-下一个排列

下一个排列class Solution {public: void nextPermutation(vector<int>& nums) { //双指针法 - 探索规律去做题 if(nums.size() == 0) { return; } int left = nums.size() - 1; int right = left; while(left > 0) {

2020-11-10 17:39:52 90

原创 LeetCode每日一题-根据数字二进制下 1 的数目排序

根据数字二进制下 1 的数目排序给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。class Solution {public: struct cmp { int Bytr1Size(int num) { int count = 0; while(num) {

2020-11-06 19:51:50 147

原创 LeetCode每日一题-单词接龙

单词接龙给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:class Solution {public: //深度优先搜索DFS - 超时 // bool IsRight(const string& beginWord, const string& str) { // //判断beginword字符串 是否可以变成 str //

2020-11-06 00:34:07 148

原创 LeetCode每日一题-有效的山脉数组

有效的山脉数组给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组:A.length >= 3在 0 < i < A.length - 1 条件下,存在 i 使得:A[0] < A[1] < … A[i-1] < A[i]A[i] > A[i+1] > … > A[A.length - 1]class Solution {public:

2020-11-03 16:07:33 142

原创 LeetCode每日一题-O(1) 时间插入、删除和获取随机元素 - 允许重复

O(1) 时间插入、删除和获取随机元素 - 允许重复// 初始化一个空的集合。RandomizedCollection collection = new RandomizedCollection();// 向集合中插入 1 。返回 true 表示集合不包含 1 。 collection.insert(1);// 向集合中插入另一个 1 。返回 false 表示集合包含 1 。集合现在包含 [1,1] 。collection.insert(1);// 向集合中插入 2 ,返回 true 。

2020-11-01 18:42:40 106

原创 LeetCode每日一题-岛屿的周长-2020-10-30补录

岛屿的周长给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。class Solution {public: int islandPerimeter(vec

2020-11-01 00:34:35 139

原创 LeetCode每日一题-求根到叶子节点数字之和

给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;.

2020-10-29 21:15:58 118

原创 LeetCode每日一题-独一无二的出现次数

独一无二的出现次数给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。class Solution {public: bool uniqueOccurrences(vector<int>& arr) { if(arr.empty()) { return true; } unordered_map<int

2020-10-28 23:16:24 127

原创 LeetCode每日一题-二叉树的前序遍历

二叉树的前序遍历给定一个二叉树,返回它的 前序 遍历。class Solution {public: vector<int> preorderTraversal(TreeNode* root) { // if(root) { // vec_.push_back(root->val); // preorderTraversal(root->left); // preorderTr

2020-10-27 17:51:50 112

原创 LeetCode每日一题-数组中的最长山脉

数组中的最长山脉我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:B.length >= 3存在 0 < i < B.length - 1 使得 B[0] < B[1] < … B[i-1] < B[i] > B[i+1] > … > B[B.length - 1](注意:B 可以是 A 的任意子数组,包括整个数组 A。)给出一个整数数组 A,返回最长 “山脉” 的长度。如果不含有 “山脉” 则返回 0。class

2020-10-25 12:54:45 210 3

原创 LeetCode每日一题-回文链表

回文链表请判断一个链表是否为回文链表。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: // bool isPalindrome(ListNode* head) { /

2020-10-23 09:55:02 73

原创 LeetCode每日一题-划分字母区间

划分字母区间字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。class Solution {public: vector<int> partitionLabels(string S) { //1、采用定长的数组存储每个元素的最大位置 int hash[26] = {0}; for(int i = 0; i < S.size()

2020-10-22 10:51:25 204 1

原创 LeetCode每日一题-长按键入

长按键入你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。class Solution {public: bool isLongPressedName(string name, string typed) { //1、鲁棒性检查 if(!name.size() &a

2020-10-21 10:01:03 85 1

原创 LRU最久未使用淘汰算法实现

LRU: 缺页置换算法中的一种, 当容量满的时候, 添加新的一页,就会置换淘汰掉最久未使用的一页。实现:可以采用链表实现: 主要是因为该算法体现在头部和尾部的操作居多。因此采用双向链表为佳。 介于C++STL容器的list实现为一个方式。由于牵扯到判断是否存在的问题, 因此需要遍历查找。 该算法实现时间复杂度为o(n)双向链表实现#include <iostream>#include <list>#include <unordered_map>using

2020-10-14 22:57:14 349

原创 计数排序&基数排序

在此之前我是不了解基数排序的, 昨天专门研究了下。 感觉是一种非常不错的排序算法。时间复杂度很低o(n), 空间复杂度为o(n)。说实话,没有多少种排序算法可以达到这样的性能。仔细研究了下,发现在很多种情况下采用这样算法可以做到很好的处理。(例如字符串排序, 电话号码排序等)一、计数排序如果想要学会基数排序, 那么首先要了解计数排序, 因为基数排序封装了计数排序。那么对于计数排序, 我有一种很强烈的感觉就是用空间换取时间。我想大家都知道哈希思想。1、开辟一块很大的辅助空间(能够存储最大

2020-10-05 14:16:27 402

原创 SYN泛洪攻击

今天我们来讨论一个问题: 就是SYN泛洪攻击。泛洪攻击出现在三次握手阶段, 这是TCP协议本身存在的缺点。一、泛洪攻击原理:攻击方以伪造的IP地址向服务器发送大量SYN请求(对应接口是connect),我们知道这是三次握手的第一个报文, 服务器收到SYN请求之后, 会返回SYN+ACK的报文(表明自己已经接受到你的连接请求, 并且我也想和你建立连接)。正常的客户端连接是会返回ACK报文的。 但这个攻击方不会返回ACK。攻击方负责大量地发送SYN请求,但不响应服务器端地回应。最终会导致服务器

2020-09-22 23:27:28 1428

原创 KMP算法-实现多重查找

这个算法是计算关于字符串匹配问题。求一个字符串在另一个字符串是否存在, 如果存在下标在哪里?str1 = “abcdefgh”str2 = “efg”求str2是否为str1的字串, 很显然可以看出下标为4.这里我推荐大家看下刘毅大佬的文章, 写得很详细。大佬KMP算法详解另一位大佬的KMP解析我相信大家看完之后,就会有所体会、了解。这块大佬给我们留下一些猜想, 就是第一次找到了就不会去寻找了, str1字符串中后面或许还有的呢, 我就做一些弥补吧, 也是写这篇文章的原因。基于大佬给

2020-09-13 16:48:49 1306

原创 2021届秋招携程笔试编程题

说实话, 不知道该不该写这篇文章。毕竟昨天晚上刚面试过了,今天就写, 有点害怕!感觉答得不怎么样,不过尽全力发挥了。 题目不太适合我的方向。我对数据库方面的知识有些欠缺, 还有道java的题,怎么说了。。。。。。尽全力就行了。编程第一道大题:找到敏感词汇, 把字符串的敏感词汇替换成目标词汇。举个例子:敏感词汇: you句子: i love you, ouy love me替换词: jack输出: i love jack, jack love me句子中you、ouy都属于敏感词汇,

2020-09-09 16:57:40 1383

原创 八皇后问题&最小换乘问题

这道问题很精辟, 考察回溯的实现。对于一个二维数组何如回溯的思想很有帮助。由于我找到一个写得非常不错的文章, 我就不在这里自取欺辱了。大佬的八皇后思想分解基于这道题的思想, 我自己对于二维数组的回溯实现有了一定的了解。还是很有帮助的, 本章文件就相当于是一篇转发吧。核心框架:void Find_Queen(vector<vector<int>>& queen_pos, int rows, int* steps) { //rows 控制 行数, 当rows ==

2020-09-08 00:44:28 190 1

原创 两个无序的数组合并为一个有序的数组

这道题很有意思。考察对于排序思想的理解。我相信大部分的人都写过两个有序链表的合并, 不过前提是有序。这里是无序的。 其次是链表合并指向变化, 不许要开辟额外的空间就可以去做。这里不可以。 因此是数组。 你可以思考一下充满了挑战性。那么这道题该如何处理呢?1、将一个数组元素插入到另一个数组中,然后调用一次排序算法。这种思想可以说, 非常简单, 还有点取巧。我们分析性能, 时间复杂度, 我们采用快速排序去做。nlogn, 感觉还可以哦!我想这种思想是可以说的,但是不能作为最终的解法。 可以提一

2020-09-07 19:47:06 3680 1

原创 大数运算分析

何为大数运算?就是数据量过多, 内存放不下, 如果去处理的问题。 下面我们通过例题分析在这里, 我们先讲一些换算公式:1G = 10亿byte, 2G = 20亿byte一般内存大小为4G, 内核占用2G, 用户最大能够使用2G左右(我们一般认为用户最多能够使用2G空间)一、给一个超过100G大小的IP地址, 设计算法找到出现次数最多的IP地址?100G的ip地址, ip为4byte, 如果想要全部存在, 需要100*4 = 400Gbyte大小的空间而我们只有2G空间的大小, 很显然

2020-09-05 22:45:22 385

原创 谈谈有意思的const参数函数重载问题

这道问题我们经常遇到, 但是几乎很少对它有过研究。我们以一段代码作为引言:#include <iostream>using namespace std;void Fun(int a) { cout << "nonconst-a" << endl;}void Fun(const int a) { cout << "const-a" << endl;}int main() { int a = 10; const in

2020-09-05 09:49:37 159

原创 c++基类对象如何访问派生类的独有的属性

这种问题很有意思。我们都知道派生类对象可以访问基类的属性, 因为是继承(共有),继承基类的属性并在此基础上做扩充。因此支持派生类对象、指针、引用赋给基类对象, 也叫切片操作、也叫上行转化。但是基类不能赋给派生类对象, 是不支持的。你可以强转基类对象为派生类对象指针,进行赋值, 这种操作也叫下行转化,存在安全隐患。那么如何让基类访问派生类对象独有的属性呢?1、我想我们应该想想看多态, 这是我第一次想到这个问题的联想。多态允许我们基类对象访问派生类重写的虚函数, 但是这是要存放在虚表中 的虚函数,

2020-09-03 17:50:49 2074 1

原创 说说mysql中的幻读???

最近复习mysql, 复习到事务那块, 对于幻读和不可重复读这块的概念老是搞不清。今天专门说说这个幻读。说到这个, 我们先讲讲事务那块存在的问题。当两个不同mysql用户对同一张表的数据访问时存在的问题。下面的所有情况都是两个mysql用户同时开始事务begin。以mysql用户A和mysql用户B为例。1、脏读用户B对这个表的数据进行修改。在没有commi提交之前, 用户A可以看到修改后的数据。 也就说B用户对这个表数据的任何操作A都是能看到的 - 这就是脏读。为什么说是脏读?个人理解,

2020-08-27 21:40:00 105

原创 tcp/ip详解

个人感觉tcp协议有种弥补ip协议的不足。ip协议是一个无状态、无连接、不可靠的服务。当接受端分用数据时, 它提交给上层协议时,这些数据可能是乱序的、重复的。他不会处理这些数据。 因此需要我们上层的传输层TCP协议来进行处理,处理完毕之后递交给应用层。说说IP协议的优点:1、由于无状态, 内核不需要开辟资源维护双方通信信息,简单、高效, 这点和UDP、HTTP协议相同。2、由于无状态, IP通信双方不会长时间维护对方IP地址信息, 每次发送数据时,都需要指定对端的IP地址。3、不可靠, IP

2020-08-27 19:30:29 191

原创 备战练习(五)(动态规划)

介绍这篇时, 我会用简单讲讲动态规划的思想, 毕竟动态规划的思想是很重要的。做这种题有种感觉, 你会思想,推出状态, 状态转移方程, 问题自然游刃而解。如果推不出,这种题真心很难,无从下手。一、将这种题的做法分为两步:1、从实际问题看规律,推出状态、状态转移方程。(这种是最难的、也是最关键的。)2、编写代码二、动态规划问题特点这种题的特点,大问题可以划分小问题, 小问题可以划分为更小的问题, 每个问题解决方法都是类似的。举例简单的斐波那契数列。[1,1,2,3,5,8,13,21…]1、状

2020-08-13 11:17:53 269

原创 备战练习(四)

一、回文数索引#include <iostream>#include <vector>#include <string> using namespace std; bool IsHui(const string& str) { if(str.size() == 0) { return true; } int begin = 0; int end = str.size() - 1; w

2020-08-10 20:48:48 116

MD5算法(实现磁盘管理).pdf

实现MD5算法逻辑图,包括思想, 填充、运算、左移, 更新,整合

2020-05-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除