面试题
1feng
这个作者很懒,什么都没留下…
展开
-
查找n个数中最小的k个元素
/* 求n个数中最小的k个元素 * 用堆排序:时间复杂度为O(nlgk) */#include /* 求左右叶子、父结点的宏定义 */#define LEFT(i) ((i) * 2)#define RIGHT(i) ((i) * 2 + 1)#define PARENT(i) ((i) / 2)/* 维持堆的性质 * 算法原理:选取当前结点及其子结点3个中的最大值,原创 2013-08-02 20:52:48 · 1050 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树的非递归遍历需要用到栈,三种遍历方法中最麻烦的是后序遍历,因为它需要访问根结点2次,故在第一次访问的时候需要标示它的访问状态。#include #include using namespace std;typedef struct _Tree{ int data; struct _Tree *left; struct _Tree *right;} Tree;ty原创 2013-09-19 14:16:05 · 591 阅读 · 0 评论 -
2014阿里巴巴笔试题
现在没有完全整理好,下面是附加题:题目:两棵二叉树T1和T2,T1的节点数是百万量级,T2的节点数一千以内,请给出判断T2是否T1子树的可行算法。分析:首先想到的是递归,但是T1的数量级太大,递归会导致栈溢出,于是以非递归实现。bool IsSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) { if (pRoot1 =原创 2013-09-14 23:15:19 · 2631 阅读 · 3 评论 -
从n个数中选择m个数,使其和为s
题目:从n个数中任选m(小于n)个数,使其和为s//判断数组b对应的数组a中的元素之和是否为sbool isSum(int a[], int b[], int n, int s) { int ret = 0; for (int i = 0; i < n; i++) { ret += a[b[i]]; } return s == ret;}//a:初始数组//n:a包含的元原创 2013-08-27 16:24:53 · 4852 阅读 · 1 评论 -
关键词 volatile 的理解
volatile的字面意思是:不稳定的,易变的。它的主要作用是向编译器说明该变量是易变的,防止编译器做如取缓存值等有关的优化,保证取的值永远是最新的。const 与 volatile意思相反,它们可以一起使用,并且将它们一起使用还可以看出const 变量为伪“常量”的本质。如:const int a = 3;int *ptr = const_cast(&a);*ptr = 4;原创 2013-08-21 15:02:11 · 566 阅读 · 0 评论 -
循环左移字符串
题目:循环左移字符串,如:输入1234567,循环左移 3 位得到4567123。思路:设字符串AB,A的倒序为A*,B的倒序为B*,则 (A*B*)* = BA(跟矩阵的转秩一样)。代码如下:#include #include //将s从start到end间的字符串倒序void _reverse(char *s, int start, int end) { int原创 2013-08-04 00:19:31 · 726 阅读 · 0 评论 -
求整数的二进制表达中有多少个1
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的转载 2013-08-04 01:40:04 · 768 阅读 · 0 评论 -
求从1,2...n中取任意个不重复的数和为m的所有组合
编程求解:输入两个整数 m 和 n ,从 1 , 2 , 3.......n 中随意取几个数(不重复) ,使其和等于 m , 要求将其中所有的可能组合列出来。下面是在网上看到的方法:分治,即 m = idx + m - idx,从最大数字n开始查找,然后逐渐后退,但每次查找只会在比当前数字大的方向进行组合尝试,这样可以保证找到的组合不会重复。 #include #includ原创 2013-08-03 21:57:03 · 1403 阅读 · 0 评论 -
不用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)求1+2+…+n
题目:不用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)求1+2+…+n。在网上看到2种解法,解法1:利用类的静态变量,每创建一个类对象,将静态变量增加一定的值,然后创建一个n大的对象数组,打印出该静态变量。解法2:利用&&的短路性质(其实是变相的 if 表达式),然后进行递归。int sum(int n) { int t原创 2013-08-03 16:41:05 · 1243 阅读 · 0 评论 -
判断整数序列是否为二叉查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果,因此返回true。 8 / \ 6 10 / \ / \ 5 7 9 11 如果输入7、4、6、5,没有原创 2013-08-03 13:21:27 · 678 阅读 · 0 评论 -
翻转句子中单词的顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格隔开,为简单起见,标点符号和普通字母一样处理。例如:输入"I am a student.",则输出:"student. a am I"。#include #include #include char *reverse_sentense(char *s) { int n = 0; int l原创 2013-08-03 15:44:11 · 610 阅读 · 0 评论 -
线性时间查找第k大元素
/* 找出第k大的元素可以使用:堆排序,桶排序等方法,这里介绍一种O(n)的分治算法:先对数组划分,然后判断第k小的元素应该在哪个分组,再对相应的分组递归 */int partion(int *a, int start, int end) { int rnd = start + rand() % (end - start + 1); int tmp = a[rnd]; a[rnd] = a原创 2013-08-02 19:42:16 · 1308 阅读 · 0 评论 -
在二叉排序树中查找和为给定值的路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如:输入整数22 和如下二元树 10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12 和10, 5, 7。思路:1、当访问到某一节点时,把该结原创 2013-08-02 14:19:32 · 1145 阅读 · 0 评论 -
判断单链表是否有环
转自:http://eriol.iteye.com/blog/1184348题目 :给出两个链表的头指针,比如h1,h2,判断这两个链表是否相交。扩展:(1) 如果链表可能有环呢?(2) 如何求出两个相交链表的相交的第一个节点。如果链表没有环假设两个链表没有环,如果它们相交,那么它们的最后一个元素必定相同。JAVA代码为:public boolean isC转载 2013-08-02 23:01:17 · 614 阅读 · 0 评论 -
将二叉排序树转化成双链表
跟中序遍历原理一样,只要修改访问操作即可,下面提供递归与非递归方法:bool bt2list(Tree *root, Tree ** head, Tree **tail, bool *sethead) { if (root == NULL) return false; if (root->left != NULL) tr2list(root->left, head, tail,原创 2013-09-19 21:50:20 · 738 阅读 · 0 评论