面试题汇总
suibianshen2012
这个作者很懒,什么都没留下…
展开
-
【LeetCode】1. Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they add up to the target, whe转载 2016-08-18 23:36:23 · 326 阅读 · 0 评论 -
【LeetCode】167. Two Sum II - Input array is sorted
Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two number转载 2016-08-18 23:05:19 · 467 阅读 · 0 评论 -
输入两个整数m和n,计算m需要改变多少位才能得到n
题目:输入两个整数m和n,计算m需要改变多少位才能得到n?解析: 这个题我最开始是没有思路的,想了很久才有点思路,思路的来源是把他们转化成二进制后才有的 例如:(5)的二进制:0101 (3)的二进制:0011 如果要把5变成3的话,需要改变:2次,因为第一位0和最后一位1都相同 所以不需要改变,做法转载 2016-08-18 15:41:48 · 796 阅读 · 0 评论 -
Remove Duplicates from Sorted Array——移除排序数组中重复元素
Remove Duplicates from Sorted ArrayGiven a sorted array, remove the duplicates in place such that each element appear only once and return the new length.Do not allocate extra space for anothe转载 2016-08-17 23:09:16 · 480 阅读 · 0 评论 -
二叉排序树和双向链表
题目描述:将二叉排序树转换成一个排序的双向链表,要求:不能创建任何新的节点,只能通过调整指针的指向来实现;解题思路:我们知道二叉排序树的递归定义是:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树;二叉排序树的一个很重要的特性就是:二叉树中序遍历的结果是一个递转载 2016-08-04 22:49:51 · 609 阅读 · 0 评论 -
数组中只出现一次的数
本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢。欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求:数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次。请给出最快的方法找到x。 这个题目非常有意思,在转载 2016-07-21 22:50:27 · 352 阅读 · 0 评论 -
查找数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。输入:每个测试案例包括两行:第一行包含一个整数n,表示数组中的元素个数。其中1 第二行包含n个整数,每个数组均为int类型。输出:对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。样例输入:47 5 6 4转载 2016-07-19 23:08:55 · 6363 阅读 · 3 评论 -
只允许遍历一遍字符串,找出字符串中第一个只出现一次的字符
find the first unique character in a string and you can just traverse this string only one time. if there is no such character, just return '#' and '#' will not appear in the string, else return the转载 2016-07-29 22:06:26 · 1546 阅读 · 0 评论 -
c++编译报warning: control reaches end of non-void function
用gcc编译一个程序的时候出现这样的警告:warning: control reaches end of non-void function它的意思是:控制到达非void函数的结尾。就是说你的一些本应带有返回值的函数到达结尾后可能并没有返回任何值。这时候,最好检查一下是否每个控制流都会有返回值。转自:http://blog.csdn.net/liukun321/转载 2016-08-19 10:02:02 · 12224 阅读 · 0 评论 -
LeetCode | Remove Element
解法一:空间复杂度O(n) 使用额外的空间可以使思路变得简单,要做的就是从A里面逐一拷贝元素到aux里,其中跳过elem就行了。缺点就是提升了空间复杂度,还有到最后需要把aux 的值在重新赋值给A,这样时间复杂度也多了一倍到达了theta(2n),空间复杂度为O(n) 复制代码int removeElement2(int A[], int n原创 2016-08-19 10:41:19 · 273 阅读 · 0 评论 -
leetcode:Remove Element
Remove ElementGiven an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesn't matter what you leave beyond转载 2016-08-19 20:29:12 · 285 阅读 · 0 评论 -
字符串反转
问题:给一个字符串,比如 “I love china”, 把字符反转后变成 “china love I”思路:先把字符串从第一个字符与最后一个字符对换,第二个字符和倒数第二个字符对换,这样,我们就把每一个单词位置互换了。但是我们要求单词里面字符的顺序是不能变的,所以,我们要把每一个单词里面的字符从头到尾对换一下。这样就可以得到我们想要的字符串了。实现:因为这转载 2016-09-26 15:40:36 · 371 阅读 · 0 评论 -
两个有序数组的中位数
这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉。后来搜了一下leetcode的难度分布表(leetcode难度及面试频率)才发现,该问题是难度为5的问题,真是小看了它!网上搜了很多答案,但是鲜见简明正确的解答,唯有一种寻找第k小值的方法非常好,在此整理一下。 首先对leetcod转载 2016-08-25 21:58:49 · 1563 阅读 · 0 评论 -
strncpy:复制源字符串的前n位,到另一个字符串中
//strncpy///原型:extern char *strncpy(char *dest, char *src, int n);///功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中,取代dest/// 中最前面的n个字符。///说明:如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。/// 如果src的长度小于n个字节,则原创 2016-08-23 21:59:38 · 2887 阅读 · 0 评论 -
随机问题之--洗牌算法
洗牌算法是我们常见的随机问题,在玩游戏、随机排序时经常会碰到。它可以抽象成这样:得到一个M以内的所有自然数的随机顺序数组。在百度搜“洗牌算法”,第一个结果是《百度文库-洗牌算法》:http://wenku.baidu.com/view/c4fea82658fb770bf78a55b7.html扫了一下里面的内容,很多内容都容易误导别人走上歧途,包括最后用链表代替数组,也只是一个有限的优化(转载 2016-08-23 21:40:24 · 433 阅读 · 0 评论 -
单链表排序
因为单链表不能按照下表索引访问元素,因此不能够进行远程交换排序、或者动态分治法排序,能想到的只是相邻元素交换的冒泡排序。代码:#include using namespace std; /* * 编程实现单链表的排序 */ typedef struct Student{ int data; struct Student *next; }node; //获取单链转载 2016-09-11 22:34:53 · 449 阅读 · 0 评论 -
1000以内的质数
#include #include #include int isPrime(int x){ if(x<=0) { return 0; } else if(x==1 || x==2) { return 1; } else { int i; for(i=2;i<x;i++) { if(x%i==0) { break; } }转载 2016-09-11 21:44:40 · 1039 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp] view plain copy转载 2016-07-19 23:07:31 · 389 阅读 · 0 评论 -
一个无序数组中两个数之和等于给定的值sum
【问题描述】给定一个数组,求两个数之和=给定值sum的所有组合个数。【变形】两个数之和=sum的任意一组数【方法一】穷举法从数组中任意找两个数,看其和是否=sum。时间复杂度O(N^2)【方法二】先排序,然后定义两个指针,一个i=0指向数组头,一个j=len-1指向数组的尾,看其和是否==sum;若==,则查找成功返回;若>sum,则尾指针j--;若时间复杂原创 2016-07-16 11:47:11 · 15998 阅读 · 1 评论 -
反转二叉树--递归和非递归
【如题】对一棵二叉树进行反转,即各个节点的左右子树进行反转。【方法一】非递归层序遍历:每遍历一个结点,对其左右结点进行交换。交换根结点的左右子树;交换第二层结点的左右子树。。。。。。。TreeNode* inverse(TreeNode* root){ if(root==NULL) return NULL; queue que; que.push(r原创 2016-07-29 20:39:15 · 6232 阅读 · 0 评论 -
单链表是否有环,求环起点,环长等
1.判断单链表是否有环 使用两个slow, fast指针从头开始扫描链表。指针slow 每次走1步,指针fast每次走2步。如果存在环,则指针slow、fast会相遇;如果不存在环,指针fast遇到NULL退出。 就是所谓的追击相遇问题: 2.求有环单链表的环长 在环上相遇后,记录第一次相遇点为Pos,之后指针slow继续每次走1步,fast每转载 2016-07-26 08:25:11 · 1593 阅读 · 0 评论 -
查找链表的中间节点
转自:http://blog.csdn.net/wkupaochuan/article/details/8663335题目的解法当然不可能是一次遍历得到链表长度,然后再遍历一半,那是最最没办法的办法。在链表中很多题目的解法都跟大小指针有关。比如这道题目,设立两个指针,一个单步走,一个两步走,当大步指针到达链表尾部的时候,小步指针也正好位于链表中间位置。算法实现如下:转载 2016-07-26 07:53:02 · 882 阅读 · 0 评论 -
寻找两个有序数组中的第K个数或者中位数
假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序合并后的第K个数。解法一:使用两个指针指向A和B的开头,很容易在O(M+N)的时间内完成,此算法略过。解法二:使用二分的方法。算法思想在代码注释中[cpp] view plain copy print?#include转载 2016-07-14 17:28:28 · 1818 阅读 · 0 评论 -
求一个数组中第k大的数
求一个数组中第k大的数【方法一】冒泡:因为只要冒泡k趟即可,第一趟冒泡第一大,第二次冒泡第二大,第k次冒泡第k大,时间复杂度为O(kn),n为数组长度。但是我们都知道快速排序是对冒泡的改进,降低冒泡的递归深度,使时间复杂度降低到O(nlgn),为什么不用快排呢?那么快排的时间复杂度又是多少呢?【方法二】快排--不用完全快排完成:因为快排每次将数组划分为两组加一个枢纽转载 2016-07-14 16:50:33 · 1866 阅读 · 0 评论 -
复杂链表的复制
【问题描述】有一个这样的复杂链表:每个节点有一个数据域val,一个指向下一个节点的next指针;和一个指向链表中任意一个节点或者为NULL的random指针;现要求复制一个完全一样的链表出来。【思路】方法一:蛮力法。①首先,复制链表的节点,暂时不处理随机指针;②针对每个节点,用暴力法搜索原链表找出,随机指针的指向节点,然后新链表的随机指针同样指向该节点。时间复杂度:O(N2原创 2016-07-14 15:11:24 · 422 阅读 · 0 评论 -
topk--堆排序--小顶堆
【问题描述】假设需要我们在一堆海量数据中找出排名前k的数据;最好的方法是用最小堆排序,直接用前k个数据建立一个小顶堆,然后遍历剩余的数,①如果此数②如果此数>堆顶的数,则将此数和堆顶的数交换,然后从堆顶向下调整堆,使其重新满足小顶堆。【说明】堆的存储一般用数组来表示堆,第i个节点的父节点下标为i/2-1;它的左右节点下标分别为:2*i+1和2*1+2【代码】原创 2016-07-14 07:58:54 · 5544 阅读 · 0 评论 -
海量数据中找出前k大数(topk问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。 先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。转载 2016-07-23 10:59:36 · 23790 阅读 · 2 评论 -
TCP/IP三次握手,四次挥手
建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:先来看看如何建立连接的。首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。那如何断开连接呢?简单的过程如下:转载 2016-07-23 10:29:45 · 334 阅读 · 0 评论 -
连续子数组的最大和
【问题描述】输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)【解析】看到O(n)时间复杂度,我们就应该能够想到我们只能对整个数组进行一次扫描,在扫描过程中求出最大连续子序列和以及子序列的起点和终点位置。假如输入数组为{1,-2,3,10,-4,7,2,-5},我们尝试从头到尾累加其中的正数,转载 2016-07-16 10:42:21 · 359 阅读 · 0 评论 -
【Top-k问题】如何从海量数据中找出前k大数
1. 问题描述在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载率最高的前10首歌等等。2. 当前解决方案针对top k类问题,通常比较好的方案是【分治+trie树/hash+小顶堆】,即先将数据集按转载 2016-07-05 17:24:42 · 4450 阅读 · 0 评论 -
有100W个关键字,长度小于等于50字节。用高效的算法找出top10的热词,并对内存的占用不超过1MB。
①先把100W个关键字hash映射到小文件,根据题意,100W*50B = 50*10^6B = 50M,而内存只有1M,故干脆搞一个hash函数 % 50,分解成50个小文件;②针对对每个小文件依次运用hashmap(key,value)完成每个key的value次数统计,后用堆找出每个小文件中value次数最大的top 10;③最后依次对每两小文件的top 10归并,得到最终的to转载 2016-07-05 17:29:02 · 1371 阅读 · 0 评论 -
数组循环移位
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。 不合题意的解法如下: 我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次。abcd1234--->4abcd123--->34abcd12--->234abcd1--->1234abcd。代码如下所示:[cpp] view pla转载 2016-07-18 22:39:48 · 573 阅读 · 0 评论 -
二分查找算法
二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间元素,即5,由于5 2.寻找{6, 7, 8,转载 2016-07-07 23:15:01 · 391 阅读 · 0 评论 -
C语言中实现数组的动态增长
原理: 在C语言中数组下标访问可以看成指针的偏移访问1、对表进行检查,看看它是否真的已满2、如果表确实已满,使用realloc()函数扩展表的长度,并进行检查,确保realloc()操作成功进行。3、在表中增加所需要的项目code:int current_element=0;int total_element=128;char *dynamic=mall转载 2016-07-07 22:44:42 · 3929 阅读 · 0 评论 -
归并排序
目录要点 归并排序的基本思想算法分析 归并排序算法的性能 时间复杂度 空间复杂度 算法稳定性 归并排序和堆排序、快速排序的比较完整参考代码 Java版本参考资料相关阅读回到顶部要点归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,转载 2016-07-07 09:38:29 · 473 阅读 · 0 评论 -
合并两个有序数组为一个有序数组
二、问题:两个有序数组,合并成一个有序数组,假设第一个数组空间足够容纳两个数组。分析:考虑到a数组很大,可以直接在a数组上进行合并,但是要讲究效率。如果单纯从前往后合并,那么效率会非常低,因为a数组后面的数字需要不停的移动。换一种思路,我们采用从后往前合并,首先计算出总长度,设置一个指针从a数组最后往前移动。算法代码:{CSDN:CODE:1748851转载 2016-07-06 21:49:44 · 7069 阅读 · 0 评论 -
判断两个字符串是否由相同字符组成
【题目描述】如题:写一个算法来判断两个字符串是否为换位字符串。(换位字符串是指组成字符串的字符相同,但位置不同)【方法一】假设为ASCII码字符串,那么可以分配两个256大小的int数组,每个数组用于统计一个字符串各个字符出现的次数,最后,比较这两个int数组,看是否每个元素都相同。时间复杂度为O(n)。int IsSame(char* str1, char转载 2016-07-28 09:43:14 · 5413 阅读 · 1 评论 -
二叉排序树中的第k小元素
【题目描述】如题:查找二叉排序树中的第k小元素【若是结点的话,就直接输出TreeNode就行】。即leetcode的230题【方法一】1、计算左子树元素个数left。2、 left+1 = K,则根节点即为第K个元素 left >=k, 则第K个元素在左子树中, left +1 K-left-1元素。计算树中的节点个数转载 2016-07-28 08:37:45 · 6317 阅读 · 1 评论 -
排序算法总结
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,转载 2016-07-17 15:25:20 · 564 阅读 · 0 评论 -
几种进程间的通信方式
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。#信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问转载 2016-07-22 23:25:18 · 309 阅读 · 0 评论