
C/C++
文章平均质量分 75
「已注销」
这个作者很懒,什么都没留下…
展开
-
最长回文子串(Longest Palindrome Substring)--Manacher算法O(n)
Problem Description:给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等下面介绍一种复杂度只有O(n)的Manacher算法:首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号。比如 abba 变成原创 2013-06-09 17:46:51 · 2676 阅读 · 0 评论 -
C++ 虚函数表解析
前言 C++关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,没有详细的说明,没有比较,没有举一反三。不利于学习和阅读,所以这是我想写下这篇文章的原因。也希望大家多给我提意见。 了解的人都应该知道虚函数(Virtual Function。在这个表中,主是要一个类的虚转载 2015-01-28 18:50:02 · 729 阅读 · 0 评论 -
关于sizeof()的一些思考
今天面试被问到sizeof,回来整理一下。1、定义sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (includin原创 2015-01-28 18:35:12 · 1082 阅读 · 0 评论 -
C++11 thread
1.线程的创建C++11线程类std::thread,头文件include 首先,看一个最简单的例子:[cpp] view plaincopyvoid my_thread() { puts("hello, world"); } int main(int argc, char *argv[])转载 2015-02-02 23:15:52 · 988 阅读 · 0 评论 -
C++ 对象的内存布局
前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是为了图一些表达上方便和简单。不想,这篇文章成为了打开C++对象模型内存布局的一个引子,转载 2015-02-02 23:23:41 · 815 阅读 · 0 评论 -
Leetcode: Fraction to Recurring Decimal
Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.If the fractional part is repeating, enclose the repeating part in parentheses.原创 2015-02-05 00:12:53 · 2287 阅读 · 0 评论 -
指针函数与函数指针
1.指针函数先看下面的函数声明,注意,此函数有返回值,返回值为int *,即返回值是指针类型的。int *f(int a, int b); 上面的函数声明又可以写成如下形式:int* f(int a, int b);让指针标志 * 与int紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,f是函数名,返回值类型是一个int类型的指针。下面看指针函数的实现转载 2015-01-18 17:27:52 · 741 阅读 · 0 评论 -
[5]智能指针boost::scoped_ptr
【1】boost::scoped_ptr简介boost::scoped_ptr属于boost库,定义在namespace boost中,包含头文件#include 便可以使用。一句话:一个作用域指针(即所谓智能指针scoped_ptr对象)独享一个动态分配的内存对象管理所有权。【2】boost::scoped_ptr与stl::auto_ptr的联系boost::scoped_转载 2015-01-17 21:42:59 · 915 阅读 · 0 评论 -
[3]C++智能指针
【1】为什么需要智能指针?搞清楚智能指针的设计动机,对于正确的理解智能指针的工作原理,设计思想,以及适用场合是有着非常直接的帮助,所以让我们先来看一看为什么需要智能指针。从本质上来说,智能指针的引入实际上是为了解决一个问题:为了有效准确地管理程序运行过程中动态申请的内存资源,以妥善地解决动态申请到的内存的拥有权问题。在C++程序中,我们经常会出于这样那样的原因,需要从系统堆(heap)转载 2015-01-17 20:59:22 · 710 阅读 · 0 评论 -
[4]智能指针std::auto_ptr
【1】std::auto_ptr对于编译器来说,智能指针实质是一个栈对象,而并非指针类型。智能指针通过构造函数获取堆内存的管理所有权,而在其生命期结束时,再通过析构函数释放由它所管理的堆内存。所有智能指针都重载了“operator->”操作符,直接返回对象的引用,用以操作对象。访问智能指针原来的方法则使用“.”操作符。访问智能指针包含的裸指针则可以用get()函数。由于智能指针转载 2015-01-17 21:29:49 · 933 阅读 · 0 评论 -
[1]C++智能指针详解
一、简介由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::share转载 2015-01-17 00:12:13 · 904 阅读 · 0 评论 -
[7]智能指针boost::weak_ptr
【1】boost::weak_ptr简介boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include便可以使用。【2】boost::weak_ptr详解智能指针boost::scope_ptr和智能指针boost::shared_ptr就完全可以解决所有单个对象内存的管理问题。为什么还多出一个boost::weak_ptr转载 2015-01-17 22:00:21 · 869 阅读 · 0 评论 -
[8]C++智能指针的简单实现
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷转载 2015-01-18 12:30:33 · 819 阅读 · 0 评论 -
[6]智能指针boost::shared_ptr
【1】boost::shared_ptr简介boost::shared_ptr属于boost库,定义在namespace boost中,包含头文件#include便可以使用。boost::scoped_ptr中我们看到boost::scoped_ptr独享所有权,不允许赋值、拷贝。而boost::shared_ptr是专门用于共享所有权的,由于要共享所有权,其在内部使用了引用计数机制。转载 2015-01-17 21:50:44 · 1503 阅读 · 0 评论 -
C++之RAII技术解析
1.什么是RAII 技术?我们在C++中经常使用new申请了内存空间,但是却也经常忘记delete回收申请的空间,容易造成内存溢出,于是RAII技术就诞生了,来解决这样的问题。RAII(Resource Acquisition Is Initialization)机制是Bjarne Stroustrup首先提出的,是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的原创 2015-01-22 22:51:18 · 13635 阅读 · 0 评论 -
Copy On Write(写时复制)
Copy On Write(写时复制)是在编程中比较常见的一个技术,面试中也会偶尔出现(好像Java中就经常有字符串写时复制的笔试题),今天在看《More Effective C++》的引用计数时就讲到了Copy On Write——写时复制。下面简单介绍下Copy On Write(写时复制),我们假设STL中的string支持写时复制(只是假设,具体未经考证,这里以Mircosoft Visu转载 2015-04-19 15:46:31 · 4410 阅读 · 0 评论 -
深入理解C++的动态绑定和静态绑定
为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。需要理解四个名词:1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。2、对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。关于对象的静态类型和动态类型,看一个示例:[cpp] vi转载 2013-10-30 22:38:34 · 1492 阅读 · 0 评论 -
[C/C++]static关键字用法总结
Static关键字用法总结 static关键字是C, C++中都存在的关键字。static从字面理解,是“静态的“的 意思,与此相对应的,应该是“动态的“。static的作用主要有以下3个:1、扩展生存期;2、限制作用域;3、唯一性; 1、扩展生存期这一点主要是针对普通局部变量和static局部变量来说的。声明为static的局部变量的生存期不再是当前作用转载 2013-10-30 22:31:20 · 1329 阅读 · 0 评论 -
笔试题目“翻转字符串”的实现
最近找实习,要面试各种公司,据说这题在笔试或者面试当中,出现的频率非常高//写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。我自己写了个实现:/**将字符串翻转*翻转方式如下:“I am a student”反转成“student a am I”**方法:*先反转整个字符串,然后原创 2013-04-23 22:56:21 · 5176 阅读 · 0 评论 -
堆和堆排序
堆,是一棵完全二叉树,根的值大于左右子树中所有结点的值,左右子树也是堆,除此之外,对其它元素之间的大小关系(如左右子树之间元素大小关系)没有要求。这是大根堆,如果把“大于”换成“小于”,就是小根堆,这里都以大根堆为例。由于堆是完全二叉树,所以可以用数组来模拟,在数据结构上算是比较简单。用数组模拟二叉树(当然也包括堆)的话,如果根节点的下标为0的话,则对于每个结点i,其左孩子下标为2*i+1;其原创 2013-04-26 19:55:14 · 1188 阅读 · 0 评论 -
常用的排序算法:插入排序,希尔排序,冒泡排序,选择排序,快速排序,归并排序
昨晚准备今天的腾讯实习生的面试,就把常用的排序算法又写了一遍,放这儿吧,以后没事看看。Sort.h#ifndef SORT_H#define SORT_Hvoid insertSort(int x[], int n);void shellSort(int x[], int n);void bubbleSort(int x[], int n);void selec原创 2013-04-23 16:14:13 · 1650 阅读 · 2 评论 -
在一个数组中查找最大的K个元素或者最小的K个元素
面试中经常会遇到查找最大的K个元素或者最小的K个元素的问题。如果是查找最大的K个元素,就用小根堆,如果当前元素比堆的根都元素大,那么一定要放到堆里来,用当前元素替换根元素(因为根的元素是最小的),然后调整堆。查找最小的K个元素用大根堆同理。上代码:#include using namespace std;//在数组arr[1..size]中,使得以i为根的子堆保持大根堆的原创 2013-04-27 11:30:41 · 1550 阅读 · 0 评论 -
用queue实现的基数排序RadixSort
代码是用queue实现的基数排序,其中arrlength表示数组长度,maxbit表示arr数组中int型整数的最大位数,如果maxbit=3,表示最大为3位数,即不超过999/**************************************/* /* 函数名 : Radix Sort/* **********************************原创 2013-04-26 23:17:44 · 1279 阅读 · 0 评论 -
寻找丑数(Ugly Number)
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。 求按从小到大的顺序的第1500个丑数。 分析:这是一道在网络上广为流传的面试题,据说Google曾经采用过这道题。 方法一:从小到大的遍历,这是我们最容易想到的方法了吧。不过这种方法很耗时间,用下面的代码查找第1500个丑数原创 2013-05-05 23:05:00 · 2478 阅读 · 0 评论 -
散列表(哈希hash)初步
1. 引言 哈希表(Hash Table)作为一种高效的数据结构,正在发挥着重要的作用。 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。 哈希表又叫做散列表,分为“开散列” 和“闭散列”。考虑到原创 2013-05-08 23:01:17 · 1487 阅读 · 0 评论 -
网易有道笔试题
这几道题都是从网上找的不知道是哪一年的网易有道的笔试题,拿来做做,练练手。1、打印如下形式的矩阵;n=5:1 2 9 10 254 3 8 11 245 6 7 12 2316 15 14 13 2原创 2013-05-31 19:37:17 · 8625 阅读 · 0 评论 -
最长重复子串(LongestRepeatSubstring)
一个单字符串问题。子字符串a在字符串S中至少出现两次,则称a是S的重复子串。如果某个子串在目标字符串中出现两次,那么它必将出现在两个不同的后缀中,因此对后缀数组进行排序,以寻找相同的后缀,然后扫描数组,比较相邻的元素便可以找出最长的重复子串。#includeusing namespace std;int comlen(char* a, char* b){ int len = 0;原创 2013-06-07 11:14:50 · 1861 阅读 · 0 评论 -
兄弟单词
好长时间没写blog了,写一篇表示我还活着,还在看代码,还在准备笔试和面试。。。兄弟的单词就是两个或多个单词有相同的字母,只是字母顺序不同,例如:abfs 和fabs。找到所给单词的兄弟单词。方案一:使用数据结构 map。兄弟单词共用一个签名key,key为单词内部排序后的词条,list存储同一key的单词集合;把相同key的兄弟单词组成一个链表。代码:#include#incl原创 2013-07-08 23:38:02 · 7706 阅读 · 0 评论 -
2013年阿里巴巴暑期实习生笔试题--2013年5月5日考试
昨天本来想去参加北大的笔试,结果去了说不给霸笔,尼玛,好吧,哥又乖乖的回来了,现在有网上有题目了,拿过来做做,好好准备下参加19号的笔试!--------------------------------------------------------------------------------------------------------------答题说明:1.原创 2013-05-06 09:20:56 · 24354 阅读 · 53 评论 -
通配符的字符串匹配算法
1. 简述 题目描述: Str1中可能包含的字符:除了'*'和'?'以外的任意字符。 Str2中可能包含的字符:任意字符。其中,'?'表示匹配任意一个字符,'*'表示匹配任意字符0或者多次。 给出这样两个字符串,判断Str2是否是Str1的子串,如果是输出第一个匹配到的子串,如果不是,输出"不是子串"。2. 分析 对于'?'的处理,转载 2013-09-05 17:54:14 · 9001 阅读 · 1 评论 -
C++ Boost
Boost准标准库boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化。不过对比STL,boost更加实用。STL集中在算法部分,而boost包含了不少工具类,可以完成比较具体的工作。 boost主要包含一下几个大类:字符串及文本处理、容器、迭代子(Iterator)、算法、函数对象和高阶编程、泛型编程、模板元编转载 2013-10-11 20:19:13 · 7821 阅读 · 0 评论 -
把vim打造成牛逼的C++ IDE
对于windows上做C++开发的用户来说,vs为他们做了大量的工作,语法高亮、自动缩进、智能提示等等,当你happy的使用vs时,请记住一点,这是一个收费软件,虽然在我大中华普遍都在使用微软的盗版软件,但作为程序员我们心里应该知道这是不对的行为,然后再去——等等,我们今天讨论的不是这个话题,我们要说的是Linux下的免费软件vim!vim插件安装的教程在互联网上已经数不胜数,但是质量也参转载 2015-08-02 11:49:45 · 57498 阅读 · 9 评论