自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 收藏
  • 关注

原创 HTTP介绍以及演变

HTTP基本概念:超文本-传输-协议是在计算机世界中两点之间传输文字,图片,视频等超文本数据的约定和规范。HTTP 0.9版本:只有get请求,发出的请求没有请求头,没有版本号。已弃用HTTP 1.0版本:新增了多种请求方式,新增了状态码:分别是信息响应(1XX),成功响应(2XX)、重定向响应(3XX)、客户端错误响应(4XX)和服务端错误响应(5XX),定义了消息头部等。存在的问题:每次发起一个请求都要新建一次TCP连接(三次握手)。而且是串行请求,做了无畏的TCP连接以及断开,增加通信开销

2022-01-07 23:15:39 1003

原创 iOS-常驻线程实现以及优雅退出方式

RunLoop的开启方式: - (void)run; //使线程进入死循环,不利于控制线程退出,不推荐 - (void)runUntilDate:(NSDate *)limitDate; //可以设置超时时间,在runloop处理完毕或者超时结束,可以选择重新开启runloop,优于上面的方式 - (BOOL)runMode:(NSRunLoopMode...

2020-04-11 21:40:55 1022

原创 iOS-RunLoop

RunLoop概念: 运行循环。实际上是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行。 在没有事件处理时,会进入睡眠状态,节省CPU资源,直到有事件将它唤醒。RunLoop与线程的关系: RunLoop与线程是一一对应的,每一个线程都有唯...

2020-03-24 16:02:46 238

原创 iOS-Runtime消息机制

Runtime消息机制: 本质上讲,OC的每一次方法调度都是一次消息的发送。其中方法调度的原理如下:/***************************************************************** * * id objc_msgSend(id self, SEL _cmd,...); * **********************...

2020-03-23 15:48:13 223

原创 iOS-View Layout相关方法

相关方法- (CGSize)sizeThatFits:(CGSize)size -(void)sizeToFit——————-- (void)layoutSubviews- (void)layoutIfNeeded- (void)setNeedsLayout——————–- (void)setNeedsDisplay- (void)drawRectlay...

2020-03-21 22:32:35 236

原创 iOS-Runtime基础结构

iOSRuntimeRuntime概念:OC是基于C的,区别于C的一点就是OC属于动态语言,并且有面向对象的特性。相比于C,函数的调用在编译的时候会决定调用哪个函数。OC会在编译和链接时做的事情放到了运行时(Runtime)来处理,其调用函数的方法为msg_send,属于动态调用,只有在真正运行才会根据函数名称找到对应的函数来调用。即使调用未实现的方法在编译阶段也不会报错(调用阶段如果不处理仍...

2020-03-21 21:40:50 170

转载 阻塞与非阻塞,同步与异步

阻塞与非阻塞,同步与异步1. 概念理解     在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。例如普通B/S模式(同步):提交请

2017-08-20 15:02:42 454

原创 模拟C库中atoi与itoa

int my_atoi(char*str){ if (str == NULL) return 0; bool flag = true; if (*str++ == '-') flag=false; int res = 0; while (*str >= '0'&&*str <= '9') { res =

2017-08-15 10:33:59 390

转载 auto_ptr、shared_ptr、weak_ptr、scoped_ptr用法小结

auto_ptr是现在标准库里面一个轻量级的智能指针的实现,存在于头文件 memory中,之所以说它是轻量级,是因为它只有一个成员变量(拥有对象的指针),相关的调用开销也非常小。 下面的代码来自于VC++ 8.0里面的源码:  里面有个auto_ptr_ref的数据结构,我们可以把它忽略,这个只是内部使用的代理结构,用于一些隐式的const变化,我们客户端代码通常不会直接使

2017-08-13 19:21:09 490

转载 C库中的strcpy,strncpy,memcpy,memmove,memset函数

一.函数介绍:1、memcpy函数原型:extern void *memcpy(void *dest, const void *src, size_t count);用法:#include功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。注意:和strcpy相比,memcpy不是遇到

2017-08-09 13:14:42 563

原创 布隆过滤器

位图只能用来快速判断一个整数是否在一堆整数中,如果我们想要判断一个字符串是否在一堆字符串里,那么位图就做不到了,因此布隆过滤器就出现了。它是由一个很长的二进制向量和一系列随机 映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。那我们可以利用哈希函数计算出它具体的存放位置。 它的优点是空间效率和查询时间都远远超过一般的算法,将这40亿的数据内存由16GB变成500MB,可见其强大。 缺

2017-08-06 21:25:56 368

原创 位图的简易实现及相关面试题

概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用。本文介绍了位图的实现方法及其应用场景。位图的简易实现。#pragma once#include<iostream>#include<vector>using namespace std;class BitMap{public: BitMap(int size) { _tabl

2017-08-06 10:57:40 499

转载 海量数据分析问题总结

1)给⼀个超过100G⼤⼩的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?第一题:首先我们的思路就是利用哈希进行文件的切分,我们把100G大小的logfile分为1000份,那么下来差不多没一个文件就是100M左右,然后再利用哈希函数除留余数的方法分配到对应的编号文件中,然后得出每个文件中出现次数最多的IP,然后堆排序取得这1000个ip中出现次数最多的。

2017-08-06 10:56:35 610

原创 删除字符串中重复字符。

题目:删除字符串中重复字符。如果可以,优先删除重复字符中排在比他小字符前面的字符。 比如,输入:bbcacdww;输出:bacdw 分析:如果根本不允许开设数组,则只能就地进行字符串去重,那么可以依次访问字符串中的字符,并删除从该字符串开始到结尾的所有相同字符。时间复杂度为O(n^2 )。void removeDuplicate(char s[]){ int i = 0; whil

2017-08-05 11:51:40 11681

原创 将N个字符的数组,循环右移K位。

要求:时间复杂度为O(N) 思路: 将一个字符串分成两部分,X 和Y 两个部分,在字符串上定义反转的操作X^T,即把X 的所有字符反转(如,X=”abc”,那么X^T=”cba”),那么我们可以得到下面的结论: (X^TY^T)^T=YX。显然我们这就可以转化为字符串的反转的问题了。 就拿abcdef 这个例子来说,若要让def 翻转到abc 的前头,那 么只要按下述3 个步骤操作即可:

2017-08-05 10:28:58 830

原创 无序数组的中位数

题目:求出一个无需数组的中位数。例:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。 要求: 不能使用排序。 思路1:将数据平均分配到最大堆和最小堆中,并且保证最小堆中的数据存放的数据都比最大堆中是数据大,那么此时最小堆堆顶的元素一定是中位数。 那么如何保证最小堆中的元素,都比大堆中的元素大 (1)遍历数组,将第i个数插入堆

2017-08-05 10:05:40 1359 1

原创 要求对数组a进行排序,要求时间复杂度为O(N)

题目: int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N) 。void sort(int *arr, int size){ if (arr == NULL || size <= 0) exit(1); int data[20]; memset(data, 0, S

2017-08-04 23:04:20 1573

转载 CVTE水果面试题

好像是去年CVTE在招聘的时候出了这样的一个笔试题:       题目的大意就是:本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的三种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出排列前三的这三种水果。  

2017-07-31 14:42:43 687

转载 C++实现一个线程安全且高效单例类。(懒汉与饿汉)

在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式。单例模式分为懒汉模式,跟饿汉模式两种。首先给出饿汉模式的实现template class singleton{protected: singleton(){};private: singleton(const singleton&){};//禁止拷贝 singleton& operat

2017-07-29 16:39:02 558

原创 将二叉搜索树转化为一个排序的双向链表

题目: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,职能调整树中结点指针的指向。如下图所示: 由于要求转换之后的链表是排好序的,我们可以中序遍历树中的每一个结点,这回死因为中序遍历算法的特点是按照从小到大的顺序遍历二叉树的每一个节点。当遍历到根结点时,我们可以把书=树看成三部分:值为10的结点,根结点值为6的左子树,根结点值为14的右子树。根据排序链表的

2017-07-29 16:28:26 444

原创 C语言模式实现C++继承和多态

继承与多态的概念 继承:是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力,已有类被称为父类/基类,新增加的类被称作子类/派生类。 多态:按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同现方式即为多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单说就是允许基类的指针指向子类的对象

2017-07-28 15:07:48 348

原创 由前序遍历和中序遍历重建二叉树

题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出所示的二叉树并输出他的头结点。struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLef

2017-07-28 14:36:44 545

转载 判断一颗树是否是完全二叉树

一.问题描述  有一棵树判断该树是否是完全二叉树?二.问题分析1.完全二叉树的定义?  判断一棵树是否是完全二叉树,首先要知道什仫是完全二叉树?完全二叉树就是除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。   [html] view plain copy若设二叉树的深度为h,除第

2017-07-27 11:19:51 4763 2

原创 求解两个集合的差集,集合是以单向链表存储

题目: 已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。 链表结点的结构类型定义如下: struct node { int elem; node* next; };

2017-07-25 11:12:45 609

原创 判断一棵二叉树是否是平衡二叉树/求一颗二叉树的镜像

根据平衡二叉树的定义,如果任意节点的左右子树的深度相差不超过1,那这棵树就是平衡二叉树。 首先编写一个计算二叉树深度的函数,利用递归实现。int Depth(TreeNode*pRoot){ if (pRoot == NULL) return 0; else { int ld = Depth(pRoot->left); in

2017-07-24 11:54:33 399

原创 链表逆置(给出一个链表和数k)

题目: 给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k).思路分析: 将链表中长度为K的一段翻转后再拼接回去,形成新链表。ListNode* ReverseList(ListNo

2017-07-23 12:37:39 552

原创 一个数组中有一个数字的次数超过了数组的一半,求出这个字符

题目: 一个数组中有一个数字的次数超过了数组的一半,求出这个字符。 如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。解法一: 可以借用排序算法的思想,因为其中的一个数字超过了数组的一半,所以不论该数字是大还是小,数组中间的元素即为所求。解法二: 思想是:如果一个数出现的次数超过数组一半的长度,那么就是说出现的次数比其他所有数字出现的次数还要多。

2017-07-22 11:37:00 397

原创 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?求N!的二进制表示中最低位1的位置。

题目1:给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。初看这样的题目可能会想到直接求出N!的阶乘,然后再计算出0的个数。显然用这种方法如果N很大的情况下,非常容易溢出。所以我们可以换个角度来分析这个问题。N=1×2×3×4×5×6×··· ×N我们可以对N!进行分解质因数 即N!=2x ×3y ×5z ·····

2017-07-21 12:16:33 996

原创 元素出栈、入栈顺序的合法性。

题目: 判断元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。 我们可以定义一个辅助栈,来帮助我们做这样的题。我们把第一个序列中的数字一次压入栈中,压入的过程中按照第二个序列的顺序依次从栈中弹出数字。 使用vector来存放两个序列,

2017-07-20 09:52:16 369

原创 二进制中1的个数

解法一: 首先把i和1做与运算,判断I的最低位是不是为1。接着把1左移一位得到2,在和i做与运算,就能判断i的此地为是不是1…这样反复左移,每次都能判断i的其中一位是不是1。代码如下:int NumberOf1(int n){ int count = 0; unsigned int flag = 1; while (flag) { if (

2017-07-20 09:33:12 320

原创 输入两棵二叉树A,B,判断B是不是A的子结构。

要查找树A中是否存在和树B结构一样的子树。我们可以分为两步: 第一步在树A中找到和B的根节点一样的值一样的结点R,第二步在判断树A中以R为根节点的子树是不是包含和树B一样的结构。 树的结点:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x

2017-07-19 13:52:10 957

原创 查找一个字符串中第一个只出现两次的字符。

题目:查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)。由于本体的特殊性,我们可以定义一个非常简单的哈希表。。字符(char)是一个长度为8的数据类型,因此总共有256中可能。于是我们创建一个长度为256的数组,每个字母根据其ASC码值作为数组的下标对应数组的一个数字,而数组中存储的是

2017-07-19 10:51:10 727

原创 替换空格

题目:-替换字符串中的空格为$$$。要求时间复杂度为O(N) 方法 我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后的字符串的长度等于原来的长度加上3乘以空格数目。 我们从字符串的后面开始复制和替换。首先准备两个指针,P1和P2. P1指向原始字符串的末尾,而P2指向替换之后的

2017-07-18 13:30:44 528

原创 复杂链表的复制

题目:请实现函数,复制一个复杂链表。在复杂链表中,每一个节点除了有一个m_pNext指针指向下一个节点外,还有一个m_pSibling只想链表中的任意节点或者NULL。节点定义如下:struct ComplexNode{ int m_nValue; ComplexNode* m_pNext; ComplexNode* m_pSibling;}; 方法: 第一步,根据原

2017-07-18 11:17:41 276

原创 笔试/面试:删除一个无头单链表的非尾节点 ,从尾到头打印单链表

删除一个无头单链表的非尾结点struct ListNode{ int _value; ListNode*_next; ListNode(int value = 0, ListNode*pnext = NULL) :_value(value) , _next(pnext) {}};//节点的后一个节点赋值给要删除的节点,再删除这个后

2017-07-18 10:00:26 389

原创 判断两个链表是否相交,若相交,求交点。(假设链表带环、不带环)

问题1: 给出两个链表的头指针,判断这两个链表是否相交。假设两个链表均不带环。 解法一: 如果两个链表都无环,则可以把第二个链表接在第一个链表后面,如果得到的链表有环,则说明这两个链表相交。这里如果有环,则第二个链表的表头一定在环上,只需要从第二个链表开始遍历,看是否会回到起点即可判断。假设两个链表长度分别为m和n,则时间复杂度为O(m+n)。 解法二: 先分别统计出两条链表中的结

2017-07-16 16:59:59 1073

原创 -设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。

设计一个类不能被继承常规解法:将构造函数设为私有函数在C++中,子类的构造函数会自动调用父类的构造函数,子类的析构函数也会调用父类的析构函数。要想一个类不能被继承,只要把它的构造函数和析构函数都设置为私有函数。那么当一个类试图从那里继承时,势必会因为调用构造函数和析构函数而导致编译错误。可是这个类型的构造函数和析构函数都是私有函数,我们怎样才能得到该类型的实例呢?我们可以通过定义共有的

2017-07-15 13:49:51 591

原创 判断链表是否带环?若带环求环的长度?若带环求环的入口点?

1.判断链表是否带环用快慢指针求,快指针一次两步,慢指针一次走一步,如果带环的话那么快指针最终会与慢指针相遇,如果快指针fast或者fast->next走到NULL的话,则说明链表不带环。pair*, bool> IsExitsLoop(Node* head){ assert(head); Node* fast = head; Node* slow = head;

2017-07-15 13:11:20 316

转载 实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--等等

分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。看到的这个题目,首先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的。实际上,我们可以分成三步的:第一步只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);第二步做进位,5+

2017-07-15 12:39:19 1180

原创 查找单链表的倒数第k个节点,要求只能遍历一次链表

为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。既然不能从尾结点开始遍历这个链表,我们还是把思路回到头结点上来。假设整个链表有n个结点,那么倒数第k个结点是从头结点开始的第n-k-1个结点(从0开始计数)。如果我们能够得到链表中结点的个数n,那我们只要从头结点开始往后走n-k-1步就可

2017-07-15 11:17:06 1178

空空如也

空空如也

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

TA关注的人

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