程序员面试金典
数据小冰
好记性不如烂笔头,学习、实践、总结,成为更好的自己。
展开
-
数组中重复的数
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。 思路1:容易想到用Hash数组,即桶排序的思想,申请一个n长度大小的数组,将输入数组中的元素放入到Hash数组中,然后统计H原创 2016-03-17 20:30:11 · 446 阅读 · 0 评论 -
确定字符互异
题目:请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。 思路:对于字符串的重复判断,根据字符数量256个,题目不能使用额外存储空间,可以依次将每一个字符和其原创 2016-02-27 16:20:29 · 720 阅读 · 0 评论 -
基本字符串压缩
题目:利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。 给定一个string iniString为待压缩的串(长度小于等于3000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。 思路:咋一分析,题目还是很简单的原创 2016-02-27 15:38:07 · 5466 阅读 · 0 评论 -
魔术索引I
题目:在数组A[0..n-1]中,有所谓的魔术索引,满足条件A[i]=i。给定一个升序数组,元素值各不相同,编写一个方法,判断在数组A中是否存在魔术索引。请思考一种复杂度优于o(n)的方法。给定一个int数组A和int n代表数组大小,请返回一个bool,代表是否存在魔术索引。 思路:直接法就是循环一遍,对A[i]==i是否成立进行判断,但题目要求复杂度低于o(n), 易想到用二分法,可以递归原创 2016-02-27 09:31:18 · 553 阅读 · 0 评论 -
访问单个节点的删除
题目:实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。给定带删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true 分析:对于单向链表,要删除一个节点A,只要找到节点A的前驱节点AA,然后修改AA指向下一个节点的值,将其指向A节点的后继即可,但本题有限制,已知要删除的节点,又因为是单链表,所以无法获得其前面一个节点的指针,巧妙的做法是将要删除节点的后一个节原创 2016-02-25 20:00:23 · 781 阅读 · 0 评论 -
碰撞的蚂蚁
题目:在n个顶点的多边形上有n只蚂蚁,这些蚂蚁同时开始沿着多边形的边爬行,请求出这些蚂蚁相撞的概率。(这里的相撞是指存在任意两只蚂蚁会相撞) 给定一个int n(3<=n<=10000),代表n边形和n只蚂蚁,请返回一个double,为相撞的概率。 分析:总共有2^n可能,不相碰的情况只有2个方向, p=(2^n-2)/2^n class Ants { public: d原创 2016-03-09 21:08:27 · 517 阅读 · 0 评论 -
整数转换
题目:编写一个函数,确定需要改变几个位,才能将整数A转变成整数B。给定两个整数int A,int B。请返回需要改变的数位个数。 分析:将A和B异或,判断异或后1的个数 class Transform { public: int calcCost(int A, int B) { // write code here int AB=A^B;原创 2016-03-08 23:01:47 · 383 阅读 · 0 评论 -
二叉树平衡检查
题目:实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。 思路:根据题目定义,子树的高度差超过1即为不平衡,所以可以写一个求子树高度的函数,用递归实现比较方便 /* struct TreeNode { int val; struc原创 2016-03-07 20:47:51 · 446 阅读 · 0 评论 -
词频统计
题目:请设计一个高效的方法,找出任意指定单词在一篇文章中的出现频数。给定一个string数组article和数组大小n及一个待统计单词word,请返回该单词在文章中的出现频数。保证文章的词数小于等于1000 class Frequency { public: int getFrequency(vector article, int n, string word) {原创 2016-03-06 19:48:35 · 813 阅读 · 0 评论 -
有序数组合并
题目:有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B。请编写一个方法,将B合并入A并排序。给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组。 思路:开辟一片m+n大小的数组空间,从数组A和B首元素开始比较,将较小的元素放入新申请的数组的,然后不断移动来比较。本题如果不新开辟一片空间,直接结果放入数组A需原创 2016-03-06 19:36:01 · 467 阅读 · 0 评论 -
清除行列
题目:请编写一个算法,若MxN矩阵中某个元素为0,则将其所在的行与列清零。给定一个MxN的int[][]矩阵(C++中为vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]矩阵(C++中为vector>),保证n小于等于300,矩阵中的元素为int范围内 思路:初次看这道题目非常简单,直接遍历该MN矩阵,如果遇到0,就将其所在的行和列清0,但这样,被清0和原始的0无法区分,导致原创 2016-02-27 17:26:17 · 590 阅读 · 0 评论