目前在阿里巴巴搬砖
自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的能力都能在这个过程中考察出来。
18.9 随机生成一些数字并传入某个方法。编写一个程序,每当收到新字符数字时,找出并记录中位数。 类似:设计一个数据结构,包括两个函数,插入数据和获得中位数 解法: 一种解法是使用两个优先级堆:一个大根堆,存放小于中位数的值,以及一个小根堆存放大于中位数的值。
18.7 给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。 解法: 原题 给定字符串,以及一个字典,判断字符串是否能够拆分为字段中的单词。例如,字段为{hello,world},字符串为hellohelloworld,则可以拆分为hello,hello,world,都是字典中的单词。
18.6 设计一个算法,给定10亿个数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。 解法: 方法1:排序 按升序排序所有的元素,然后取出前100万个数,时间复杂度为O(nlog(n)) 方法2:大顶堆 我们可以使用大顶堆来解题。
18.5 有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(也即相隔几个单词)。有办法在O(1)时间里完成搜索操作吗?解法的空间复杂度如何? 解法1:我们假设单词word1和word2谁在前谁在后无关紧要。
18.2 编写一个方法,洗一副牌。要求做到完美洗牌,换言之,这幅牌52!种排列组合出现的概率相同。假设给定一个完美的随机发生器。 解法:假定有个数组,含有n个元素,类似如下: [1][2][3][4][5] 利用简单构造法,我们不妨先问自己,假定有个方法shuffle(...)对n-1个元素有效,我们可以用它来打乱n个元素的次序吗?当然可以,而且非常容易实现。
18.1 编写一个函数,将两个数字相加,不得使用+或其他算术运算符。 int add(int a,int b) { if(b==0) return a; int sum=a^b; int carry=a&b)
1 TCP拥塞窗口的作用? 慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。
转载:http://www.kerneltravel.net/journal/v/mem.htm Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法。
解决方案 需要熟练掌握一些常见的位操作实现,具体为: 1)常用的等式:-n=~(n-1)=~n+1 2)获取整数n的二进制中最后一个1:n&(-n)或者n&~(n-1)如:n=010100,则-n=101100,n&(-n)=000100 3)去掉整数n的二进制中最后一个1:n&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000 1 利用位运算实现加法 由于我们不能使用任何算术运算符,因此可供我们使用的就只有位运算符了。
输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针,顾名思义,有个shared表明共享嘛.
select、poll和epoll的区别 在linux没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。在大数据、高并发、集群等一些名词唱的火热之年代,select和poll的用武之地越来越有限了,风头已经被epoll占尽。
参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1、动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列。
链表问题在面试过程中也是很重要也很基础的一部分,链表本身很灵活,很考查编程功底,所以是很值得考的地方。我将复习过程中觉得比较好的链表问题整理了下。 下面是本文所要用到链表节点的定义: struct Node{ int data; Node* next; }; 1. 在O(1)时间删除链表节点 题目描述:给定链表的头指针和一个节点指针,在O(1)时间删除该节点。
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。
死锁的条件 互斥条件(Mutual exclusion) :资源不能被共享,只能由一个进程使用。 请求与保持条件(Hold and wait):进程已获得了一些资源,但因请求其它资源被阻塞时,对已获得的资源保持不放。
看完了对象的构造行为和内存释放前的对象的析构行为,我们现在来看看内存的配置和释放。 对象构造前的空间分配和析构后的空间释放,定义在头文件中。其设计思想是: 向system heap要求空间。 考虑多线程状态。
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。
1 strcpy 为什么strcpy要有返回值? 返回strDest的原始值使函数能够支持链式表达式,增加了函数的“附加值”。同样功能的函数,如果能合理地提高的可用性,自然就更加理想。 链式表达式的形式如: int iLength=strlen(strcpy(strA,strB)); 又如: char * strA=strcpy(new char[10],strB); 返回strSrc的原始值是错误的。
placement new操作符能够在分配内存时指定内存位置。下面的程序使用了placement new操作符和常规new操作符给对象分配内存。 // placenew.cpp -- new, placement new, no delete #include #include #i...
转至:http://ixdba.blog.51cto.com/2895551/543737 一 、进程的概念和分类1.进程的概念 Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用同一个linux系统;多任务是指在Linux下可以同时执行多个任务,更详细的说,linux采...
我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 那虚拟内存空间是什么呢,它与实际物理内存空间又是怎样对应的呢,为什么有了虚拟内存技术,我们就能运行比实际物理内存大的应用程序,它是怎么做到的呢?呵呵,这一切的一切都是个迷呀,下面我们就一步一步解开心中的谜团吧! 进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。
du和df命令都被用于获得文件系统大小的信息:df用于报告文件系统的总块数及剩余块数,du -s /用于报告文件系统使用的块数。但是,我们可以发现从df命令算出的文件系统使用块数的值与通过du命令得出的值是不一致的。
auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心的使用它才能保证不出错,以至于它甚至无法适用于同是标准库中的那么多的容器和一些算法,但即使如此,我们仍然不能否认这个小小的auto_ptr所蕴含的价值与理念。
悬垂指针: 1:提出的原因: 请看下面的代码片段: int *p=NULL; void main() { int i=10;p=&i; coutcount == 0) delete ptr; } private: RefPtr *ptr; }; 当希望每个TestPtr对象中的指针所指向的内容改变而不影响其它对象的指针所指向的内容时,可以在发生修改时,创建新的对象,并修改相应的引用计数。
1 用一个函数判断一棵树是否平衡 题目:实现一个函数检查一棵树是否平衡。对于这个问题而言, 平衡指的是这棵树任意两个叶子结点到根结点的距离之差不大于1。 注意,对于这道题,要审清题意。它并不是让你判断一棵树是否为平衡二叉树。
http://blog.csdn.net/jinhuiyu/article/details/4487058
什么时候empty class(空类)不再是个empty class呢?当C++处理过它之后,是的,如果你自己没有声明,编译器就会为它声明(编译器版本)一个copy构造函数、一个copy assignment操作符和一个析构函数。
http://www.wendangku.net/doc/25de4061be1e650e52ea99f8-15.html
grep、sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了。只不过,相比较而言,sed和awk功能更强大而已,且已独立成一种语言来介绍。
转载:http://www.cnblogs.com/Anker/p/3269106.html 1、前言 最近在学习linux内核方面的知识,经常会看到用户空间与内核空间及进程上下文与中断上下文。
今天内推腾讯实习生一面 其中问道一个问题是,怎样在不消除递归的情况下防止栈溢出?(无论如何都要使用递归) 面试的时候,一点都不知道,只能说使用循环来消除,但是那样不满足要求,后来看看这篇博客http://blog.zhaojie.me/2009/03/tail-recursion-and-continuation.html 才懂了。
1 structure和class的区别? structure和class的唯一区别就是默认的访问控制不同,structure默认是public,class默认是Private;structure也可以有构造函数、析构函数、成员函数等。
c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new MyClass; 4.---------------MyClass a();声明了一个返回值为MyClass类型的无参函数。
递归是程序设计中的一种算法。一个过程或函数直接调用自己本身或通过其他的过程或函数调用语句间接地调用自己的过程或函数,称为递归过程或函数。 例子一:打靶 面试1:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种? 解析:靶上一共有10种可能——1环到10环,还有可能脱靶,那就是0环,加在一起公有11种可能。
编程中有一种很难发现的错误是迷途指针。迷途指针也叫悬浮指针、失控指针,是党对一个指针进行delete操作后——这样会释放它所指向的内存——并没有把它设置为空时产生的。而后,如果你没有重新赋值就试图再次使用该指针,引起的结果是不可预料的。
要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用。如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&。但是如果变量类型是指针类型,例如char*,那么需要使用该类型的指针,即指向指针的指针类型 char* *,或者该类型的引用类型char*&。
类的this指针有以下特点: (1)this只能在成员函数中使用 全局函数,静态函数都不能使用this。 实际上,成员函数默认第一个参数为T* const this。 如: class A { public: int func(int p) { } }; 其中,func的原型在编译器看来应该是: int func(A* const this,int p); (2)由此可见,this在成员函数的开始前构造,在成员的结束后清除。
例子一: /* *根据以下条件进行计算: *1、 结构体的大小等于结构体内最大成员大小的整数倍 *2、 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说double型成员相对于结构体的首地址的地址 *偏移量应该是8的倍数。
有两个变量a和b,不使用任何中间变量交换a和b。 方法一: 采用如下方法: a=a+b; b=a-b; a=a-b; 这样做的缺点就是如果a、b都是比较大的数,则a=a+b时就会越界。 而采用: a=a^b; b=a^b; a=a^b; 无需担心越界的问题,这样就比较好 注意不能相等。
21 22 23 24 ... 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13 看清以上数字的排列规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正。
1 x=x+1,x+=1,x++,哪个效率最高?为什么? 解析: x=x+1最低,因为它的执行过程如下: 1)读取右x的地址。 2)x+1 3)读取左x的地址 4)将右值传给左边的x(编译器并不左右x的地址相同)。
1 类型转换 当执行算术运算时,操作数的类型如果不同,就会发生转换,数据类型一般朝着浮点精度高、长度更长的方向转换,整数型如果转换为signed不会丢失信息,就转换为signed,否则转换为unsigned。
与一个进程关联的ID有6个或更多,如下图所示: 与每个进程相关联的用户ID和组ID 实际用户ID 实际组ID 我们实际是谁 有效用户ID 有效组ID 附加组ID 用于文件访问权限检索 保存的设置用户ID 保存的设置组ID 由exec函数保存 实际用户ID和实际组ID标识我们究竟是谁,这两个字段在登录时取自口令文件中的登录项。
下面两个函数都可用来复制一个现存的文件描述符: #include int dup(int filedes); int dup2(int filedes,int filedes2); 两函数的返回值:若成功则返回新的文件描述符,若出错则返回-1 由dup返回的新文件描述符一定是当前可用文件描述符中的最小值。
Given a list of non negative integers, arrange them such that they form the largest number. For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.
The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid.