- 博客(65)
- 收藏
- 关注
原创 slf4jSLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.SLF4J: Defaulting to no-operat
slf4j
2022-12-11 16:26:36
255
原创 米哈游笔试(9/12)
1.括号匹配(100%)//// Created by Administrator on 2021/9/12 0012.//#include<iostream>#include<stack>using namespace std;int func(string& s){ if(s.size() == 0) return 0; int result = 0; stack<char> stack_s; stack_
2021-09-12 22:18:30
1463
2
原创 delete和delete[]的区别
delete和delete[]都是用于释放指针指向的内存空间。delete只会调用一次对象的析构函数,而delete[]会调用后续所有对象的析构函数。对于基本数据类型来说,没有析构函数,所以delete和delete[]是一样的。...
2021-09-07 12:12:16
749
原创 c++ 函数重载,函数重写(覆盖)以及函数隐藏(函数重定义)
1.函数重载; 作用域:函数重载的两个函数在同一个作用域中(即在同一个类中) 特点:函数重载的两个同名函数的形参一定不一样(参数个数,参数类型,参数顺序)。返回值不同而形参一致不能算作重载。 举例:class A{//函数重载public: void test(int i){cout<<i<<endl;} int test(int i,int j){cout<<i<<end...
2021-09-02 15:12:26
372
原创 广联达笔试编程题9.1
找到一个数组中,当前位置到最后一个位置中不同数的个数。1.暴力解(超时)2.优化//// Created by Administrator on 2021/9/1 0001.//#include<iostream>#include<vector>#include<set>#include<map>#include<unordered_map>using namespace std;int main(){
2021-09-02 14:14:43
511
原创 快速排序的非递归实现
非递归的实现一般都是基于栈实现。代码:#include <iostream>#include<vector>#include<stack>using namespace std;int parti(vector<int>& vec,int begin,int end){ int i = begin; int j = end; int x = vec[begin]; while(i<j){
2021-08-28 16:23:20
114
原创 c++ 输入记录
1.输入一个整型数组(个数不确定)例如: 7 -1 -1 7 8 9(中间是空格)int main(){ int n ; int m; vector<int> nums; while(cin>>n){ nums.push_back(n); if(cin.get() == '\n'){ break; } } return 0;}...
2021-08-21 18:53:40
167
原创 网易软开(8.21)笔试记录
网易笔试真的良心!!!!赞1.两数之和小于一个目标值(100%)(需要输入输出,不会输入简直要命)。例子1(绿色部分是输入,白色为输出):代码:#include<vector>#include<iostream>#include<string>#include<set>#include<algorithm>using namespace std;void function(vector<int>.
2021-08-21 18:11:04
328
4
原创 携程笔试记录-错峰出行
题目:输入:输出:解题:题目不易看懂,看懂后可以剖析其实就是求解一个最长连续子序列,这个子序列的平均值最大。如果有两个子序列长度相等,输出靠前的部分。方法:使用滑动窗口,不过滑动窗口要逐渐变大(第一层循环);每一个滑动窗口都需要遍历一次整个数组(第二层循环);需要统计滑动窗口中的平均值(第三层循环);每完成一次循环,需要更新区间的大小,区间的平均值,区间的首部和尾部。代码:#include<iostream>#include<vector>#includ
2021-08-13 09:52:12
174
原创 llvm/clang
llvm是一个底层编译器,它最大的优点是将后端和前端分开,所以广义的llvm指的是一个llvm前端,llvm中端和llvm后端。所以如果需要支持一种新语言,只需要实现一个新的前端;如果需要支持一个新的目标架构,只需要实现一个后端。前端和后端的纽带就是LLVM IR。前端:将一个源程序转成一个LLVM IR的编译器过程:要经过语法分析器,词法分析器,语义分析器,LLVMIR生成器等,clang执行了与前端有关的一些步骤。后端:用于汇编码和机器码的生成。将LLVM IR转换成目标架构的汇编代码或者二进.
2021-08-12 13:15:48
354
原创 c++ const的用法
const是一个限定关键字,定义时必须进行初始化,且值不能发生改变1.const修饰基本数据类型,表示该变常量,不能再修改2.const修饰指针。当const在*之前,表明这是一个指向常量的指针变量;当const在*之后,表明只是一个指向变量的常指针;当*前后都有const,那么这是一个指向常量的常指针。3.const修饰引用。如果const在&之前,表明这是一个常引用,不能修改;如果const在&之后,不会有影响。4.const修饰函数。当const修饰指针参数,表示该参数
2021-08-11 16:32:42
112
原创 c++ 内存对齐
为什么要内存对齐? 现代计算机的内存空间都是以字节为单位进行划分的,而处理器的读取却不是以字节为单位,而是以双字节,四字节等,为了能更方面的读取,引出了内存对齐。 我们可以使用#pragma pack(n)来定义有效对齐值内存对齐的规则: (1)结构体中第一个成员的偏移量为0,后边每一个成员相对于结构体首地址的偏移量为该数据大小和有效对齐值较小的那个的倍数。如果有需要编译器可以在成员之间用字节自动补齐。 (2)结构体总的大小为有效对...
2021-08-11 15:30:23
103
原创 操作系统虚拟内存和地址映射
1.简单说明一下虚拟内存? 在程序装入的时候,可以将程序中很快会用到的部分先装入内存,暂时用不到的部分放在外存,就可以让程序开始执行。 在程序执行过程中,如果需要用到的信息不在内存中,由操作系统负责将所需信息从外村调入内存,然后继续执行程序。 若内存空间不够,由操作系统负责将内存中暂存用不到的信息换出到外存。 在操作系统的管理下,会让用户感觉自己的内存空间很大,这就是虚拟内存。 虚拟内存是操作性虚拟性的一个体现,它只是...
2021-08-11 11:59:53
2669
原创 c++开辟两个线程交替输出a~z
代码:#include<iostream>#include<thread>#include<mutex>using namespace std;mutex my_mutex;char num = 'a';const int max_num = 10;void PrintOdd(){ my_mutex.lock(); while(1){ if(num>'z'){my_mutex.unlock();break;}
2021-08-09 13:58:07
304
原创 c++ 使用信号量进行同步和互斥操作
头文件:#include<semaphore.h>定义了结构体sem_t;相关函数:(1)sem_init (sem_t *sem, int pshared, unsigned int value); 这个函数的作用是对sem_t指定信号量进行初始化。第一个参数是结构体sem_t,;第二个参数是设置它的共享选,如果该参数的值为0,表示不能共享信号量,反之可以共享;第三个参数指定信号两百的初始值。(2)sem_wait(sem_t * sem);...
2021-08-09 11:30:56
888
原创 TCP-流量控制
tcp流量控制: (1) 一般来说,我们总是希望数据可以传输的更快一些 如果发送方把数据发送的过快,接收方可能来不及接受,这就会造成数据的丢失。(2)所谓的流量控制(flow control)就是让发送方的发送速率不要太快,要让对方来得及接受(3)利用滑动窗口可以很方便地在TCP连接上实现对发送方的流量控制。...
2021-08-04 21:30:10
186
原创 TCP-拥塞控制
参考视频:https://www.bilibili.com/video/BV1c4411d7jb?p=61拥塞控制的概念:在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能可能就会变坏。 在计算机网络中,带宽、交换节点中的缓存和处理机等都是网络的资源。TCP的拥塞控制:慢开始;拥塞避免;快重传;快恢复; 发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化。 拥塞窗口的维护原则:只要...
2021-08-04 21:02:47
154
原创 计算机网络之网络层
网络层主要的作用是:转发和路由。转发:将当前数据报的信息转发到下一个路由器/主机(通过一个转发表)。路由:从源主机到目的主机的路径信息称为路由。ip数据报的格式:展开之后:接下来说明各个字段的作用:(1)版本号(4位):给出版本号,4:ipv4:6:ipv6.(2)首部长度(4位):ip分组首部长度。以4个字节为单位:0001表示首部长度为4个字节。0011表...
2021-08-03 21:59:32
579
原创 操作系统之信号量机制以及使用信号量实现进程(线程)同步和互斥
1.同步和互斥:同步(直接制约关系):指的是完成同一任务的伙伴进程间,因需要协调它们的工作而等待、传递信息等。(z(进程1)和m(进程2)需要完成买东西的任务,z把钱给了m,m才能去买东西。)互斥(间接制约关系):指的是两个进程因需要同一个互斥资源(资源只能给一个进程使用)而产生的制约关系。(z(进程1)和m(进程2)都需要使用打印机,只能z用完才能给m。)2.信号量机制信号量机制包括信号量和P、V操作。(1)信号量S是一个整型变量(信号量可以看做是资源)。(2) P操作就是当..
2021-07-30 11:22:54
3469
原创 什么是操作系统
下面是我对操作系统的一些了解。什么是操作系统?操作系统是一个管理计算机硬件资源和计算机软件资源的计算机程序。它向上为用户程序提供了接口,向下管理硬件资源。操作系统其实也是一个软件,是一个最接近硬件设施的软件,主要是为了向y用户提供接口,进行处理器、寄存器,外设以及输入输出设备的管理。例如,我们为了编辑文档和听qq音乐能够同时进行,我们就需要操作系统为我们提供相应的需求。换句话说,操作系统是为了资源的最大利用化。...
2021-07-28 11:29:11
115
原创 为什么类模板一般都是放在同个.h文件中
1.首先对于一个类模板来说如果一个类模板的成员函数的声明在test.h文件,而它的定义放在一个test.cpp文件,而在main.cpp文件中生成一个该类模板的实例化对象,该类的对象调用这个成员函数。这个时候就会出错。下面通过一个例子来说明这个情况。---------------------test.h-------------------template<class T>class A{ public: void f(); private: T a; };-.
2021-07-27 17:34:35
1393
原创 c++ stl vector为什么两倍扩容?如何释放内存?
要解释为什么要两倍扩容我们可以分两步理解?1.为什么选择成倍扩容,而不是成等差扩容?(1)我们假设我们使用m扩容,一共有n个元素,那么我们需要扩展多少次才能装下这n个元素,通过计算我们可以得到:,那么我们需要拷贝多少个元素呢?这个式子可以看出来总的时间复杂度为n,当平均分摊到每个元素上,时间复杂度为常数。(2)我们假设使用每次增加一个固定的常数m来扩容,总的元素个数是n,那么我们需要扩展多少次才能装下这n个元素,通过计算我们可以得到:,,那么我们需要拷贝多少个元素呢?这个式子可以
2021-07-27 09:57:59
1909
原创 什么是组合
组合的定义:如果一个类中的成员对象是另外一个类的对象,即嵌套其他类的对象作为自己的成员。创建类对象,调用构造函数的顺序,首先调用各个内嵌对象的构造函数(按照各个嵌套对象在组合类的定义顺序),接下来调用组合类的构造函数,析构函数的顺序正好相反。...
2021-07-26 21:11:05
554
原创 类如何只能静态分配和只能动态分配
1.首先讲解一下什么是类对象的静态分配和动态分配。类对象的静态分配:例如 A a;这个方式是由编译器在编译阶段完成的,主要是通过直接移动栈顶指针,挪出适当的空间,然后在这个 内存空间上调用构造函数形成一个栈对象。也就是说直接调用类的构造函数来生成一个类对象。类对象的动态分配:例如:A* a = new A();编译器对于类对象的内存分配是在运行时动态分配的,使用new产生的对象会建立在堆区。这个过程分为两步进行:(1)执行函数operator new()函数,找到合适的内存进行分配。(2)调
2021-07-26 18:42:58
1489
原创 c++ emplace_back()和push_back()的区别
emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。#include <vector> #include <iostream> using namespace std;clas
2021-07-26 15:41:49
605
4
原创 c++11新特性之 右值引用
1.首先说一下什么是左值和右值左值就是可以取地址 变量;右值不可取地址的变量。2.什么是引用?引用本质是别名,通过引用可以修改变量的值。传递参数时可以避免拷贝。3.什么是左值引用(左值变量前面取&)能指向左值,不能指向右值的引用就是左值引用。int a = 10;int &b = a;int &c = 10;//错误,左值引用指向了右值当然也是可以通过const来指向右值:const int &c = 10;//编译通过const'
2021-07-26 15:25:47
354
原创 c++ 11新特性 之 lambda表达式
一、函数对象:先讲一下什么是函数对象,函数对象本质上是一个类,只不过这个类实现了对小括号()的重载,可以像使用函数那样的使用这个类生成的对象,因此被称为函数对象:例子:class test{public: int operator()(int a,int b){ return a+b; }};int main(){ test t; int a = t(1,2); cout << a << endl;}
2021-07-26 12:43:04
165
原创 详谈c++中的虚函数
概念:虚函数虚函数表虚函数表指针多态特性的体现1.虚函数引入之后类的变化: 首先创建一个空类A,以及类A的对象aclass A{ };A a;cout << sizeof(a) << endl;我们执行结果是1,//空类的对象也会占用内存空间class A{ void func1(){}; void func2(){};};A a;cout << sizeof(a) <&l...
2021-07-23 19:02:56
242
2
原创 二叉树的先序,中序以及后序遍历(非递归实现)
二叉树的先序遍历(非递归)vector<int> FisrtRoot(TreeNode* root){ vector<int> result; if(root == nullptr){ return result; } stack<TreeNode*> stack_r; stack_r.push(root); while(!stack_r.empty()){ TreeNode* temp = stack_r
2021-07-23 13:27:21
113
原创 kmp算法 (字符串匹配算法)
假设主 串是s,子串是t;(s.size() <t.size());首先我们需要求next[t.size()](至于为什么要求,可以参考其他的博文,有很多大佬总结的极其详细,我只是为了记录一下),next数组的作用:当我们遇到不相等的字符的时候,我们指向子串的指针应该指向什么地方。bool kmp(string s,sring t){ int num_s = s.size(); int num_t = t.size(); //求next数组 vector<
2021-07-22 10:09:35
102
原创 单调栈的用法
题目:496. 下一个更大元素 I给你两个没有重复元素的数组nums1和nums2,其中nums1是nums2的子集。请你找出nums1中每个元素在nums2中的下一个比其大的值。nums1中数字x的下一个更大元素是指x在nums2中对应位置的右边的第一个比x大的元素。如果不存在,对应位置输出-1。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释: ...
2021-07-09 16:02:22
90
原创 给定一个数组,找最大的相同连续数字或者是字符
题目:力扣485:给定一个二进制数组, 计算其中最大连续 1 的个数。示例:输入:[1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.提示:输入的数组只包含0 和 1 。输入数组的长度是正整数,且不超过 10,000。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/max-consecutive-ones著作权归领扣网络所有。商业转载请联系官方授..
2021-07-09 11:59:55
496
原创 c++ __builtin_popcount()函数-关于求出一个二进制中含有多少个1
例子:class Solution {public: vector<string> readBinaryWatch(int turnedOn) { vector<string> vec_s; for(int i = 0;i<12;++i){ for(int j=0;j<60;++j){ if(__builtin_popcount(i) + __builtin_popco
2021-07-06 21:51:03
206
原创 只出现一次的数字(字符)(利用异或求解)
首先,介绍异或运算的三个性质:1.任何数是和0的异或结果都是原来的数,即;2.任何数和其自身做异或运算,结果都是0,即;3.异或运算满足交换律和结合律,即:.由以上性质,我们可以知道,两个相同的数取异或操作结果为0。因此可以用来求只出现一次的数字(字符)。例1:题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,
2021-07-06 21:01:20
455
原创 c++ fork()函数
fork()函数会创建一个与当前进程影响一样的进程。fork()函数运行失败会返回一个负数;当运行成功时,子进程会返回0,父进程会返回子进程的进程号。例子:#include <iostream>#include<unistd.h>using namespace std;int main() { cout << "enter ...." << endl; pid_t pid = fork(); cout <&
2021-06-28 16:49:08
408
原创 c++ 基类的析构函数为什么要设置成虚函数
将可能被继承的类的析构函数设置成虚函数是为了:当将一个子类对象被指向一个基类指针的时候,当我们调用基类的析构函数时(释放基类的内存空间)可以同时释放掉子类的内存空间,防止内存泄漏。默认的类的析构函数不会设置成虚函数的原因是:构建虚函数需要一定的代价,需要一定的内存空间来存储虚函数表以及虚函数指针。当一个类不需要被继承,就会造成内存空间的浪费。因此,我们一般只将被继承的类的析构函数设置成虚函数。...
2021-06-28 16:16:40
969
原创 c++ 智能指针
1.auto_ptr:该指针在c++98中采用,cpp11已经弃用。2.unique_ptr:该指针实现独占式或者严格拥有概念,保证同一时间内只有一个智能指针指向该对象。使用方法:1.unique_ptr e1(new entity());2.unique_ptr e1 = make_unique();3.auto e1 = make_unique();4.unique_ptr e2 = move(e1);//此时e1是一个空指针,movable,transfer owner
2021-06-28 11:07:08
81
原创 已知三角形的三个顶点的坐标,求三角形的面积
已知:三角形ABC的三个顶点的坐标为:求:三角形ABC的面积?解1:解2:解2是解1的拓展与延伸,但是在实际的变成过程中,解2更利于我么更快的完成编程。
2021-06-27 12:39:32
2048
原创 c++ 指针和引用的区别
1.指针有一块属于自己的空间;引用只是一个别名。2.使用sizeod(),指针的大小的4;引用的大小为所指对象的大小。3.在作为传递参数时,指针需要被解引用才可以对对象进行操作;但是引用可以直接操作其所指的对象。4.指针可以为空,为空时可以被初始化为NULL;引用不可以为空,引用必须被初始化且初始化为一个对象的引用。5.指针可以是多级指针;引用只能是一级。6.指针可以指向其他对象;但是引用只能指向一个对象。7。可以有const指针,但是没有const引用。...
2021-06-07 16:22:49
103
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人