程序员面试题
文章平均质量分 71
bupt8846
这个作者很懒,什么都没留下…
展开
-
N皇后问题
题目:设计一种算法,转载 2014-11-17 16:32:54 · 539 阅读 · 0 评论 -
生成某字符串的所有排列组合
题目:《程序员面试金典(第5版)》转载 2014-11-17 19:09:14 · 1002 阅读 · 0 评论 -
币值为25分、10分、5分和1分的硬币,计算n分有几种表示方法
题目:《程序员面试金典(第5版)》P232转载 2014-11-17 14:22:28 · 2902 阅读 · 0 评论 -
打印n对括号的全部有效组合(即左右括号正确配对)
题目:《》转载 2014-11-17 10:27:51 · 4037 阅读 · 1 评论 -
实现图片编辑软件的“填充颜色”功能
题目:《程序员面试金典(第5版)》P232 提示转载 2014-11-17 11:22:46 · 1499 阅读 · 0 评论 -
归并排序和快速排序
归并排序和快速排序转载 2014-11-17 20:42:12 · 530 阅读 · 0 评论 -
对字符串数组进行排序,将所有变位词排在相邻的位置。
题目:对字符串数组进行排序,将所有变位词排在相邻的位置。变位词就是组成的字母相同,但顺序不一样的单词。 比如说:live和evil就是一对变位词。转载 2014-11-18 10:36:49 · 1115 阅读 · 0 评论 -
给定M*N矩阵,每一行、每一列都按升序排列,判断是否存在某个元素。
题目:《程序员面试金典(第5版)》转载 2014-11-18 14:36:52 · 3256 阅读 · 1 评论 -
读取一串整数,寻找合适的数据结构和算法,实现插入元素track(int x) 方法,以及GetRankOfNumber(int x)方法,返回值为小于等于x的元素个数(不包括x本身)
题目:《程序员面试金典(第5版)》转载 2014-11-19 11:53:41 · 589 阅读 · 0 评论 -
找出二叉树中和最大的路径,路径可以从任意节点开始,到任意节点结束。
题目:leetcode Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example: Given the below binary tree, 1 / \ 2 3Return 6转载 2014-11-20 10:38:41 · 1589 阅读 · 0 评论 -
算出n阶乘有多少个尾随零
题目:《程序员面试金典 (第5版) 》 P310 设计一个算法,算出n阶乘有多少个尾随零。规定0阶乘有0个尾随零,负数没有阶乘。 提示: 1、把n! 分解成若干个素数相乘,只有 2*5 才可能产生尾随零,而2 的数量多于5,所以问题转化为计算有多少个5. 2、先数一数1到n之间有几个5的倍数(数量为n/5),然后数有几个25的倍数(数量为n/25),依次类推转载 2014-11-21 11:14:45 · 1279 阅读 · 0 评论 -
编写支持对其分配的malloc和free函数,分配内存时,malloc函数返回的地址必须能被2的n次方整除
题目:《程序员面试金典(第5版)》P281 编写支持对其分配的malloc和free函数,分配内存时,malloc函数返回的地址必须能被2的n次方整除转载 2014-11-20 22:00:47 · 1064 阅读 · 0 评论 -
寻找数组中无序的部分,并返回索引。
题目:《程序员面试金典 (第5版)》 给定一个zheng原创 2014-11-21 17:02:46 · 746 阅读 · 0 评论 -
【二分查找】为非负数组寻找一个上限cap,使得数组的和为给某个给定的数s
题目:EPI提示:数组的元素为非负数。设数组元素的和为sum,则当S`>=0 且 S`double F_function(vector &num, vector &sum, int k){ if (k == 0) return num[k] * num.size(); double res = sum[k - 1] + num[k] * (num.size() -转载 2015-01-07 17:02:35 · 559 阅读 · 0 评论 -
判断最大堆第k大的数与给定的数x的大小关系
题目:EPI P83void compare_k_th_largest_heap_core(const int* maxheap,const int &length,const int &k,const int &x,const int &id,int &larger,int &equal){ if(id>=length) return; if(maxheap[id]==x)转载 2015-01-06 13:49:49 · 629 阅读 · 0 评论 -
【二分查找】查找数组中第一个比k大的数的下标
题目:EPI提示:当left和right都是非负数时,使用 mid = left + (right - left) / 2;这种形式可以避免溢出。 当left和right一个为负另一个为非负时,用mid = (left + right) / 2;这种形式可以避免溢出。int search_first_larger_k(int* arr, int lengt转载 2015-01-06 20:04:24 · 3939 阅读 · 0 评论 -
【查找】在按照绝对值排序的数组中,找出和为k的两个数的下标
题目:EPI提示:1、假设和为k的两个数,一个为非负数一个为负数,找出其下标。2、若按照1的方法查找失败,则两个数肯定都为非负数或都为负数。pair one_nonnegative_one_negative(int* num, int length, int k){ pair res(length-1, length-1);//非负、负 while (res.转载 2015-01-07 12:21:49 · 544 阅读 · 0 评论 -
【难】求数组(包括正负数和零)中相加的和(小于或)等于k的最长子数组的长度
题目:来自脑客爱刷题给定一个无序数组arr,arr中元素可以是正数、负数和0,给定一个整数k,求arr所有子数组中,相加的和为k的最长子数组长度。解法要求:时间复杂度O(N),额外空间复杂度O(N)int getSumKMaxSubArrayLength(int* num, int length, int k){ if (num == nullptr || length转载 2015-01-05 21:36:53 · 1942 阅读 · 0 评论 -
输出0到n(含)中数字2出现了几次。
题目:《程序员面试金典(第5版)》P334 编写一个方法,输出0到n(含)中数字2出现了几次。 方法一:暴力枚举int Numof2s(int n){ int count = 0; while (n > 0) { if (n % 10 == 2) count++; n /= 10; } return count;}int NumberOf2I转载 2014-12-01 22:07:01 · 2502 阅读 · 1 评论 -
【二分查找】在一个长度未知的数组中查找一个数,返回其下标,时间复杂度O(logn)
题目:EPI提示:书上的代码我认为有错,第21行应该是int l=(1另外注意,计算 2^p 可用代码 1转载 2015-01-07 15:10:57 · 956 阅读 · 0 评论 -
最大堆的初始化、删除、插入等基本操作
以最大堆为例,实现堆的初始化、删除、插入等基本操作。 以数组的形式保存堆,则对堆的 i 节点而言,其父节点是 (i-1)/2,子节点是 2*i+1 和 2*i+2 。void Swap(int &a,int &b){ int temp=a; a=b; b=temp;}//数组maxheap第n-1位(含)前的数字已经是最大堆,现在往堆中加入数组第n位的数据,使得堆的大小加转载 2014-12-02 13:37:09 · 2483 阅读 · 0 评论 -
二叉树的前序、中序和后序遍历
来源:leetcode 二叉树的前序、中序和后序遍历 typedef struct treenode {int val;treenode *left;treenode *right;treenode(int x) : val(x), left(nullptr), right(nullptr) { }treenode(){ val=0; left=nullptr;转载 2014-12-03 10:57:21 · 687 阅读 · 0 评论 -
【哈希表】判断字符串M中的字符是否可以组成字符串L
题目:EPI提示:由于L肯定比M短,所以应该建立L的哈希表。L中的字符在M中出现一次,哈希表相应数值就减少一次,直到哈希表为空。bool anonymous_letter(const string &L, const string &M){ if (M.empty() || L.empty()) throw new exception("error"); hash_m转载 2015-01-08 21:20:24 · 619 阅读 · 0 评论 -
【数学】彻底打乱数组中元素的次序
题目:《程序员面试金典(第5版)》P332 编写一个函数,洗一副牌。要求做到完美洗牌,换言之,这副牌52! 种排列组合出现的概率相同。假设给定一个完美的随机数发生器。 void Swap(int &a,int &b){ int temp=a; a=b; b=temp;}bool shuffleArrayInteratively(int* a,int len){原创 2014-12-01 16:49:46 · 938 阅读 · 0 评论 -
【堆、 unordered_set】返回形式如a+b*√2的数中最小的k个数
题目:EPI P82class Num{public: int a; int b; double val; Num(int x,int y):a(x),b(y),val(x+y*sqrt(2)){} const bool operator==(const Num &n)const { return a==n.a && b==n.b; } const bool oper转载 2015-01-06 16:08:07 · 550 阅读 · 0 评论 -
【哈希表】实现结构RandomPool,用O(1)时间完成插入、删除和随机返回的功能
题目:来自脑客爱刷题//假设key是double类型class RandomPool{public: //cur_index记录当前插入的次序,恰好也是哈希表中已有记录的个数 KeyToIndex.size() int cur_index; //维护两张哈希表 hash_map KeyToIndex; hash_map IndexToKey; //cur_index转载 2015-01-08 21:54:55 · 1110 阅读 · 1 评论 -
【二分查找】求一个double型数据的平方根
题目:EPIint compare(double a,double b){ double diff=fabs(a-b); if(diff<1.0/100000000.0) return 0; else { return a>b?1:-1; }}double square_root(const double root){ if(compare(root,0)<0)转载 2015-01-08 16:35:53 · 2598 阅读 · 1 评论 -
给定一个正整数和负整数组成的N*N矩阵,编写代码找出元素总和最大的子矩阵。
题目:《程序员面试金典(第5版)》P348 给定一个正整数和负整数组成的N*N矩阵,编写代码找出元素总和最大的子矩阵。 提示:按照书本P350的优化后的解法,借鉴了“连续子数组的最大和” 的思想,时间复杂度为O(n^3)。//结构result是函数MaxSubMatrix()返回的数据类型struct result{ int rows;//子矩阵的行数 int co转载 2014-12-02 23:34:05 · 2501 阅读 · 0 评论 -
随机生成一些数字并传入某个方法,每当接收到新数字的时候,找出并记录中位数
题目:《程序员面试金典(第5版)》P342 随机生成一些数字并传入某个方法。编写一个程序,每当接收到新数字的时候,找出并记录中位数。 提示:用一个最大堆和一个最小堆,最大堆记录小于中位数的数,最小堆记录大于等于中位数的数。最大堆和最小堆的元素个数相差不超过1。函数GetNumber() 接收到一个数字时,与中位数对比,插入到最大堆或最小堆中。函数FindMiddleNumber转载 2014-12-02 21:18:43 · 573 阅读 · 0 评论 -
找出买卖股票的最大收益及其时间
题目:EPI 给一个长度为40的非负整数数组,表示某公司40天的股票价值。找出买卖股票的最大收益及其时间。 提示:买股票的时间必然在卖股票的时间之前。可以在同一天买卖股票。 方法1:分治法。时间复杂度O(n*logn)空间复杂度O(n)。class stocktrade{public: int buyday; int sellday; int profi转载 2014-12-04 11:18:25 · 1018 阅读 · 0 评论 -
【哈希表】用O(1)时间执行哈希表的setAll操作(即把所有值置为一个统一值)
题目:来自脑客爱刷题class Value{public: int money; unsigned long long timeslot;//增加一个时间戳 Value(){} Value(int m, unsigned long long t) :money(m), timeslot(t){}};class HashMap//键是string(员工姓名),值是int(员工工转载 2015-01-08 10:38:48 · 2028 阅读 · 0 评论 -
【二分查找】找出两个长度相等的数组中所有值的 “上中位数”
题目:来自脑客爱刷题给定两个有序数组arr1和arr2,两个数组长度相等,求两个数组中所有数的中位数。注意,这里的中位数是指 “上中位数” ,不是取两个中间值的平均数,而是取两个中间值较小的那个。例如:arr1 = {1,2,3,4};arr2 = {3,4,5,6};返回3;int FindMedianInTwoSortedArraySameLength_Core转载 2015-01-09 22:33:09 · 1038 阅读 · 0 评论 -
【极难】【二分查找】返回两个数组中第k小的元素
题目:来自脑客爱刷题给定两个有序数组arr1和arr2作为两个输入参数,还有第三个输入参数为K,返回两个数组所有数中,第K小的数(K>=1)。例如:arr1 = {1,2,3,4,5};arr2 = {3,4,5};K = 5;返回4提示:FindMedianInTwoSortedArraySameLength_Core() 这个函数在上一篇中提到。in转载 2015-01-10 00:12:57 · 526 阅读 · 0 评论 -
int类型和string类型的相互转换
题目: int类型和string类型的相互转换。 bool stringToIntIsWork = true;//注意:负数、正数带“+”号、溢出、增加全局变量标记是否运算成功int stringToInt(const string &str){ stringToIntIsWork = true; if (str.empty() || str.size()>11) {原创 2014-12-05 23:19:10 · 491 阅读 · 0 评论 -
返回某整数集合的所有子集
题目:《程序员面试金典(第5版)》转载 2014-11-16 23:59:19 · 1367 阅读 · 0 评论 -
判断字符串的字符是否只出现一次
题目:来自脑客爱刷题 给定一个字符串str,判断字符串中是否所有字符都只出现过一次。例如:str: “abc”返回truestr: “1231″返回false方法一:时间复杂度O(N)bool IsUnique(string str){ if(str.empty()) return false; bool mark[256]={fal转载 2014-12-23 11:17:09 · 1024 阅读 · 0 评论 -
判断纸条折痕的上下方向
题目:来自脑客爱刷题给一个很长很窄的纸条,把纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开,此时折痕是凹下去的,也就是突起的方向指向纸条的下方;如果从纸条的下边向上方对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是:下折痕、下折痕、上折痕;如果纸条每次都从下边向上方对折,在对折n次之后展开。此时所有折痕突起的方向是什么样的呢?请写一个函数,输入一个整数代转载 2014-12-23 11:21:24 · 1202 阅读 · 0 评论 -
求1到n之间的素数
题目:求1到n之间的素数,n>=2。 方法一:试除法。判断3到n之间所有奇数是否为素数。判断一个数是否为素数时,只需试除小于等于根号n的所有素数。bool IsPrime(int n, const vector &res){ int mark = sqrt(n); for (int index=0; index<res.size() && res[index]<=mark; i转载 2014-12-06 15:34:51 · 2555 阅读 · 0 评论 -
实现两个非负整数相乘
题目:《EPI》P181 实现两个非负整数相乘,只允许位操作,不允许自增或自减符号。 提示:左移一位相当于乘以2,右移一位相当于除以2.unsigned int Add(unsigned int x, unsigned int y){ if (y == 0) return x; unsigned int sum = x^y; unsigned int carry原创 2014-12-06 20:52:39 · 1115 阅读 · 0 评论 -
将两个数字相加,不得使用+或其他算术运算符
题目:《程序员面试金典(第5版)》P331 编写一个函数,将两个数字相加,不得使用+或其他算术运算符。 提示:书中的代码没有考虑溢出,我在函数中加入相关代码。先判断是否溢出,若溢出,则标识符IsOverflow为真,返回0;若不溢出,则计算出结果。bool IsOverflow=false;//true代表溢出,false代表不溢出unsigned int Add_un原创 2014-12-01 16:07:48 · 2256 阅读 · 0 评论