自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一个人的学习和碎碎念

GitHub地址:https://github.com/Small-Cube

  • 博客(44)
  • 资源 (3)
  • 收藏
  • 关注

原创 剑指offer-----14、链表中倒数第N个节点

1、题目描述 输入一个链表,输出该链表中倒数第k个结点。2、分析 最容易想到的办法就是,遍历一遍链表,得到其长度,然后就可以找到倒数第N个节点。还有一个方法是只遍历一遍链表,使用双指针,用一个指针先走K步,如果此时为空,说明K就是链表长度,这样返回第一个节点就好。如果不为空,这时第二个指针和第一个指针开始一起走,当第一个指针最后最后一个节点时,第二个指针刚好...

2019-05-31 19:09:24 138

原创 剑指offer-----13、调整数组

1、题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2、分析 第一种方法类似与冒泡排序,当偶数在奇数之前则交换。内循环是一趟比较的次数,外循环是一共走的趟数。第二种方法是用另外一个数组保存偶数,然后在原数组中删去偶数,再插入。也可...

2019-05-31 17:16:45 112

原创 C++-----深度探索C++对象模型-第五章-构造、析构、拷贝语意学(一)

1、拥有纯虚函数的基类不可能有实例对象。2、一般来说,类的数据成员应该被初始化,并且只在构造函数中或类的其他成员函数中指定初值,其他操作都将破坏封装特性。3、C++中,纯虚函数是可以定义和调用的,但是只能被静态的调用,不能经过虚拟机制来调用。4、不要将虚析构函数定义为纯虚函数,定义为虚函数比较好。因为在每一个派生类的析构函数都会被编译器加以扩张,以静态调用的方式调用其每一个虚基类以及上...

2019-05-31 11:05:24 205

原创 C++-----深度探索C++对象模型-第四章-Function语意学(三)

1、虚拟继承中的虚函数机制过于复杂,只建议不要在一个虚基类中定义一个非静态数据成员。2、对于成员函数的一个测试,测试函数的效能可以得到两个结果:1)inline函数有明显的提升,消除了额外的时间负担,优化版本的inline函数效率更高。2)每多一层继承虚函数执行的时间就有明显的增加,增加继承深度就增加了执行成本。3、对一个非静态数据成员取地址得到的是该成员在类布局中的位置也就是偏移量(再加...

2019-05-30 11:12:36 166

原创 C++-----MySTL实现(5)---空间配置器实现(alloc)

1、相关 前面实现的四部分其实都是为这一章做准备。首先我们来看,STL一共有六大组件:容器、算法、迭代器、仿函数、配接器、配置器。前面迭代器的实现其实只是定义了一些标准,不是真正的迭代器实现,真正的迭代器实现会放在每一个容器里,而容器的实现需要一个基本的功能就是内存分配。这一部分就来实现空间配置器allocator。 在STL的源码里,allocator这个分配...

2019-05-29 21:41:56 627 1

原创 剑指offer-----12、数值的整数次方

1、题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。2、分析 这个题需要注意的有几点,首先是判断底是否为0,需要重新写一个函数,因为在计算机内部小数其实是不准确的,可以用两数相减大于一个小的数小于一个大的数判断他们是相等的。其次是根据次方数大于0和小于0分为两种情况。书上对于下面调用的一...

2019-05-29 18:01:23 122

原创 C++-----深度探索C++对象模型-第四章-Function语意学(二)

1、多态对象有某种形式执行期类型判断法,多态其实就是使用一个基类指针寻址出一个派生类对象的意思。2、识别一个class是否支持多态,唯一的方法就是看它是否有任何虚函数。 1)编译期,找到虚函数表,每个类对象被安插一个由编译器内部产生的指针,指向这个表格。每一个虚函数被指派一个表格索引值。 2)执行期,激活虚函数。3、一个类只会有一个虚函数表,每一个表内含其对应的类对象激...

2019-05-29 17:30:56 246

原创 剑指offer-----11、二进制中1的个数

1、题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。2、分析 书上应该说了三种方法,第一种是将输入的数字不停右移然后与1相与,但这样会牵扯一个问题,如果是负数,会比较麻烦,因为负数右移时要将最高位设置为1,这样最终就会陷入死循环。为了避免这种情况,我们可以不变原来的数据,而是将1来移动,int是一个32位的数,那么我们就需要移动32...

2019-05-28 18:13:13 101

原创 剑指offer-----10、矩形覆盖

1、题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?2、分析 这道题其实还是一个斐波那契的变形。所以还是比较简单的。3、代码class Solution {public: int rectCover(int number) { if(n...

2019-05-28 17:44:30 79

原创 剑指offer-----9、变态跳台阶

1、题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。2、分析 这个和前面的就有点不一样了,这个题把前几个项写出来,可以直接找到规律,F(n)=2^(n-1)。3、代码class Solution {public: int jumpFloorII(int number)...

2019-05-27 18:11:26 111

原创 剑指offer-----8、跳台阶

1、题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。2、分析 这道题其实还是一道斐波那契数列的变形,只是前面的项稍微有点变化。3、代码class Solution {public: int jumpFloor(int number) { if(...

2019-05-27 17:44:30 114

原创 C++-----深度探索C++对象模型-第四章-Function语意学(一)

1、静态成员函数不可能做到下面两点:1)直接存取非静态成员变量(静态成员函数只属于类本身,随着类的加载而存在,不属于任何对象,是独立存在的,非静态成员当且仅当实例化对象之后才存在,静态成员函数产生在前,非静态成员函数产生在后,故不能访问,内部访问静态成员用::,而访问非静态成员要用this指针,静态成员函数没有this指针,故不能访问。)。2)不可能被声明为const(既然不能直接存取费静态成员变...

2019-05-27 17:22:08 145

原创 C++-----深度探索对象模型-第三章-Data语意学(四)

1、如果打开优化开关,封装就不会带来执行期的效率成本。2、如下代码:class Point3d{public: virtual ~Point3d(); //...protected: static Point3d origin; float x,y,z;}; 每一个Point3d 类对象含有三个坐标值,依次序为x,y,z以及一个vptr,s...

2019-05-27 09:54:33 123

原创 剑指offer-----7、斐波那契数列

1、题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。2、分析 这个问题其实已经是一个老生常谈的问题了,最常见的解决办法有三种,第一种就是常见的教科书级别的递归,但是这个有一个很大的问题就是很容易爆栈。第二种是用循环,中间记录上一步计算的结果。第三种是用数学公式。递归可以不用去考虑,最需要掌握的是...

2019-05-26 16:41:37 115

原创 剑指offer-----6、旋转数组的最小数字

1、题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2、分析 最简单的方法,是排序然后输出第一个元素就好。但是这样很明显时...

2019-05-24 19:50:35 102

原创 C++-----深度探索对象模型-第三章-Data语意学(三)

1、在C++中一个派生类对象所表现出来的东西其实是自己的成员加上基类的成员的总和,至于派生类成员和基类成员的排列顺序,并不强制指定,大部分编译器基类成员先出现(虚基类除外)。2、下面讨论四种情况:“单一继承且不含虚函数”,“单一集成并且含有虚函数”,“多重继承”,“虚拟继承”四种情况。 (1)只要继承不要多态 一般来说,具体继承(相对于虚拟继承)并不会增加空间或存取...

2019-05-23 17:21:57 155

原创 C++-----MySTL实现(4)---迭代器实现

1、相关 iterator.h文件其实并不涉及具体的哪一个容器的迭代器,只是定义了一些统一的标准,比如迭代器相应的型别,比如一个算法需要用到迭代器所指对象的型别,而怎么获得型别在前面traits编程已经说过。根据经验,最常用到的迭代器的型别有五种,value type,difference type,pointer,reference,iterator catagoly。 v...

2019-05-22 21:38:01 570

原创 C++-----虚函数、虚函数指针、虚函数表、通过指针访问类的虚函数成员

1、虚函数继承,派生类赋值给基类#include<vector>#include<iostream>using namespace std;class Base {public: Base() { A(); }; virtual void A() { cout << "Base::A" << endl; } void B()...

2019-05-22 18:44:37 953 3

原创 剑指offer-----5、用两个栈来实现一个队列

1、题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。2、分析 熟悉队列和栈的数据结构的特点,最大的不同就是队列是先入先出,而栈是先入后出。现在假设我们先用栈1push进去1,2,3三个元素,然后需要pop,那么pop的应该是1这个元素,那么我们将栈1的元素全部pop再push进第二个栈,这样第二个栈的元素入栈的顺...

2019-05-22 17:25:23 91

原创 C++-----深度探索对象模型-第三章-Data语意学(二)

1、Nonstatic data member在类对象中的排列顺序和声明顺序一样,任何中间介入的static data member都不会被放进对象布局中。2、同一个access section(也就是private、public、protected区段中),member的排列只需要符合较晚出现的member在类对象中有更高的地址。(从低到高排列)各个member不一定连续排列。有可能会有东西...

2019-05-22 16:24:15 152

原创 剑指offer-----4、重建二叉树

1、题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。2、分析 熟悉了二叉树前序和中序的遍历,便知道这个两个数组的特点。首先前序遍历第一个数字一定是根节点,然后在中...

2019-05-21 17:26:11 129

原创 C++-----深度探索对象模型-第三章-Data语意学(一)

1、一个空的class,sizeof的大小是1,这是因为编译器为每一个空类安插一个char,使得这一个class的两个对象得以在内存中配置是独一无二的。2、class的大小和以下三个因素有关: 1)语言本身所造成的额外负担。当语言支持虚基类时,会导致一些额外负担,在派生类中,这个额外的负担反应在某个形式的指针上,一般就是虚函数指针,或者是一个徐基类对象。 2)编译器对特殊情...

2019-05-21 16:01:39 152

原创 C++-----MySTL实现(3)---copy函数和fill函数

1、相关 copy函数在前面内存基本处理工具中使用过,STL中的copy函数是十分复杂的,复制操作不外乎是运用赋值操作或者拷贝构造函数,copy所用的是前面的,有时候传入copy函数的元素型别是trivial assignemnt operator,因此如果能够直接使用内存直接复制行为(memove或memcpy)便能够节省大量的时间。因此STL中copy算法用尽各种办法包括函数...

2019-05-20 21:36:23 399

原创 剑指offer-----3、从尾到头打印链表

1、题目描述 输入一个链表,从尾到头输出其节点值。2、分析 这道题很简单,利用一个栈,遍历一遍链表,将节点值push进栈,然后再将栈内元素输出。3、代码/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x)...

2019-05-20 17:50:28 96

原创 C++-----深度探索对象模型-第二章-构造函数语义学(二)

1、在严谨的C++用词中,定义是指占用内存的行为。2、显示初始化X x0;void foo(){ X x1(x0); X x2=x0; X x3=X(x0);} 如上的定义,每一个都明显以x0初始化其对象。那么必要的程序转换有两个阶段,1)重写每一个定义,其中的初始化操作会被剥除。2)类的拷贝构造调用操作被安插进去。这样上面的代码可能会变成下面这...

2019-05-20 10:56:43 183

原创 剑指offer-----2、替换空格

1、题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。2、分析 根据书中的思路,先遍历,统计字符串长度和空格个数,计算新的字符串的长度,然后用两个指针,一个指向新字符串最后一位,一个指向就字符串最后一位,开始复制,如果遇到空格替换成%20就好...

2019-05-19 17:00:06 129

原创 C++-----深度探索对象模型-第二章-构造函数语义学(一)

1、C++编译器会做很多你不知道的事,比如构造函数的隐式转换,但是可以添加explic关键字用来制止单一参数的构造函数被当作一个转换运算符。2、当编译器需要一个默认构造函数的时候,被合成出来的构造函数只执行编译器所需的行动。下面四种情况,必须为class合成一个构造函数。 1)当一个class没有任何构造函数,但是其内部含有一个类对象,且后者有一个默认构造函数,就必须为该类合成一个构...

2019-05-19 10:19:31 279

原创 剑指offer-----1、二维数组中的查找

1、题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2、分析 在题目中这样的一个二维数组,可以从左下角或者右下角开始,这样每次比较一次就可以排除掉一行或一列。注意边界条件。3、代码class So...

2019-05-18 15:37:44 131

原创 C++-----MySTL实现(3)---Traits编程技法

1、相关 很多时候我们需要根据类型的不同来调用不同的函数,在析构和构造工具的实现中,destroy函数有两个版本,第二个版本的实现用到了value_type(first)来获取迭代器的类型,在内存处理工具中,也有很多地方用到这种方式来获得一些模板的类型。其实找到相对应的源码,会发现其实他们是通过模板的泛化、特化和偏特化实现的。关于特化、偏特化可以查看这篇C++ primer关于模...

2019-05-16 20:48:51 227

原创 leetcode【其他】-----268. Missing Number(缺失数字)

1、题目描述2、分析 这道题的含义是,给出n个数字,这n个数字范围在0-n之间,0-n一共有n+1个数字,找出其中没有出现的数字。一开始想法就是排序,然后二分查找,但是这个不符合题目中的时间空间复杂度。还有一种方法,通过计算,首先计算给出的数字的和,再计算0-n的数字应该有的和,相减就是没有出现的数字,应该有的和可以用等差数列求和来计算。还有一种方法是用位操作,异或的特性...

2019-05-16 18:12:33 229

原创 C++------模板与泛型编程

一、定义模板1、函数模板template<typename T>int compare(const T &v1,const T &v2 ){ if(V1<V2) return -1; if(v1>v2) return 1;} 模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板...

2019-05-16 17:26:35 300

原创 leetcode【其他】-----20. Valid Parentheses(有效的括号)

1、题目描述2、分析 判断输入的字符串的括号是否有效,这个其实很简单了,在很早之前学习数据结构时应该都见过,这是典型的栈的应用。首先将左括号都入栈,然后在每碰到一个右括号时,判断栈顶元素是否和这个右括号匹配,如果匹配则pop。不匹配则返回false。最后判断栈是否为空,为空则所有括号都匹配,否则还是返回false。3、代码class Solution {pub...

2019-05-15 17:50:18 74

原创 C++-----MySTL实现(2)---内存基本处理工具

1、相关 STL定义了五个全局函数,作用域为初始化空间上,这样的功能对于容器的实现很有帮助,在后面的容器实现代码中会看到他们的作用,前两个函数是在上一篇实现的用于构造的construct()和用于析构的destroy()。另外三个在本节实现。其中用到几个算法比如copy()和fill()等,将在后面算法中实现,这里知道含义即可。2、代码/**STL中有五个全局函数作用...

2019-05-15 10:34:11 314

原创 C++-----MySTL实现(1)---构造和析构基本工具

1、相关 根据侯捷老师的STL源码解析以及SGI-STL-2.9版本实现。本文是第一篇,实现基本的构造和析构函数。所有相关的注释均在代码中注明,其中所需要的迭代器操作和萃取操作在之后实现,这里需要知道它们的用途。2、代码/** 定义了五个全局函数——construct(), destroy(),* uninitialized_copy(),unini...

2019-05-15 10:28:40 538

原创 C++-----深度探索对象模型-第一章-关于对象(二)

1、C++兼容C的struct关键字。2、C中struct更偏于数据封装,C++则不仅仅是封装性还包括了继承性。struct的本身带有public,class本身带有private。3、在C++中凡是处于同一个access section的数据必定保证其声明顺序在内存的顺序一致,但是不同的access section中就不一定了。4、在C++中使用struct的建议是:将数据封装起来,...

2019-05-15 10:21:34 103

原创 leetcode【其他】-----118. Pascal's Triangle(杨辉三角)

1、题目描述2、分析 实现杨辉三角,输入一个n,n为行数,根据杨辉三角的几个特性,杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。第行的数字个数为个第行的第个数字为组合数。第行数字和为。除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第行第个数字等于第行的第个数字与第个数字的和)。这是因为有组合恒等式:。可用...

2019-05-14 17:59:24 179

原创 C++-----深度探索对象模型-第一章-关于对象(一)

1、将C程序转化为C++封装后,成本其实并没有增加,数据成员放在class和struct中是一样的,成员函数虽然也在class中声明,但是并不会出现在对象中。2、C++在布局和存取时间上的主要额外负担是由virtual引起的。包括:虚函数(virtual function)机制,用以支持一个有效率的执行期绑定。虚基类(virtual base class),用来实现多次出现在继承体系中的bas...

2019-05-14 09:36:49 161

原创 leetcode【其他】-----190. Reverse Bits(颠倒二进制)

1、题目描述2、分析 这道题还是一道和二进制、位操作有关的题,将一个数的二进制颠倒。很容易想到的就是,从最后一位开始取,如果为1则先左移1位然后加1,如果为0,则只左移1位。然后再将原来的数右移一位去掉我们已经取过的位。3、代码class Solution {public: uint32_t reverseBits(uint32_t n) { ...

2019-05-12 20:17:33 150

原创 leetcode【其他】-----461. Hamming Distance(汉明距离)

1、题目描述2、分析 求两个数的汉明距离,题目中给出了定义,也就是两个数的二进制数中不同的位的个数,这个题和之前求一个数的二进制中的1的个数很像,在求一个数的二进制中的1的个数需要将每一位与1相与,这道题我们也可以这样,将两个数的每一个位分别与1相与,如果结果相同表示两个位相同,不同则计数1,然后将传入的两个数右移一位抛弃掉计算过的位。3、代码class Sol...

2019-05-12 19:17:57 160

原创 leetcode【其他】-----191. Number of 1 Bits(位1的个数)

1、题目描述2、分析 判断一个32位无符号数字中1的个数,应该算比较简单,只要用输入的数字不停地与1相与,结果为1则次数加一,然后将输入数字右移一位,循环32次就好。3、代码class Solution {public: int hammingWeight(uint32_t n) { int res=0; for(int...

2019-05-11 21:51:22 88

STM32菜单管理

使用STM32F407实现的一个简单的菜单管理,用按键控制菜单的选择,可以有二级菜单。菜单用于在屏幕上显示需要的信息。

2019-03-31

基于RFID的签到系统设计

本科毕业设计,基于RFID设计的签到系统,其中包括了签到系统设计和充值消费,通过RC522模块和stm32实现。通过按键选择对应的模式,屏幕会实时显示卡片的金额或者姓名学号等。

2018-03-28

stm32 菜单管理代码

stm32 菜单管理框架,自己写的菜单管理框架,在stm32f407上实现,主要通过构建菜单结构体,组成菜单的链表,根据按键得到的键值转向相对应的菜单。

2018-03-28

空空如也

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

TA关注的人

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