算法面试(2)
第24题:
链表操作,
(1).单链表就地逆置,
(2)合并链表
想法:这样可以吗>_<。没有经过调式的
struct node { int val ; node *next ; }; void reverse(node *&head) { node *o , p ; o=NULL ; while(head->next != NULL) { p = head->next ; head->next = o ; o = head ; head = p ; if(p->next == NULL) return ; } }
第23题:
用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交。"
3D坐标系 原点(0.0,0.0,0.0)
圆形:
半径r = 3.0
圆心o = (*.*, 0.0, *.*)
正方形:
4个角坐标;
1:(*.*, 0.0, *.*)
2:(*.*, 0.0, *.*)
3:(*.*, 0.0, *.*)
4:(*.*, 0.0, *.*)
想法:y坐标都是0 0 ,也就是二维平面上了,判断圆心到四条边的距离,都小于 r 或者都大于 r 就是不相交
第22题:
有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,
A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,
A说不知道,B说不知道,C说不知道,然后A说知道了。
请教如何推理,A是怎么知道的。
如果用程序,又怎么实现呢?
第21题
2010年中兴面试题
编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.
想法:dfs,加上一些剪支处理,复杂度o(2^n),
第20题:
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
例如输入字符串"345",则输出整数345。
想法:写写就可以了,简单
第19题:
题目:定义Fibonacci数列如下:
/ 0 n=0
f(n)= 1 n=1
\ f(n-1)+f(n-2) n=2
输入n,用最快的方法求该数列的第n项。
分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。
因此很多程序员对这道题的递归解法非常熟悉,但....呵呵,你知道的。。
想法:Fibonacci数列有公式来着,还有可以用矩阵快速幂加速
f[n] = a*f[n-1]+b*f[n-2] 是可以表示成矩阵形式的
第18题:
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
求出在这个圆圈中剩下的最后一个数字。
July:我想,这个题目,不少人已经 见识过了。
想法:除了用链表直接模拟,还有更快的解法?
第17题:
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
分析:这道题是2006年google的一道笔试题。
想法:扫两次吧,第一次记录个数,第二次出结果。
第16题:
题目(微软):
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ \
6 10
/ \ / \
5 7 9 11
输出8 6 10 5 7 9 11。
想法:可以用队列搞
struct node { int val ; node*ch[2] ; }; queue<node*>q ; void dfs(node*o) { q.push(o); while(!q.empty()) { node *p = q.front();q.pop(); cout << p->val << " " ; if(p->ch[0] != NULL) q.push(p->ch[0]) ; if(p->ch[1] != NULL) q.push(p->ch[1]) ; } puts("") ; }
第15题:
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
定义二元查找树的结点为:
struct BSTreeNode // a node in the binary search tree (BST)
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
想法:不懂这样对不对==
struct BSTreeNode // a node in the binary search tree (BST) { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; void dfs(BSTreeNode *o) { if(o==NULL) return ; swap(o->m_pLeft,o->m_pRight) ; dfs(o->m_pLeft) ; dfs(o->m_pRight) ; }
第14题:
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
想法:大概这样
void find(int a[],int n ,int x,int &ans1,int &ans2) { int L,R; L=1;R=n; while(L<R) { if(a[L]+a[R]==x) { ans1=a[L] ; ans2=a[R] ; return ; } else if(a[L]+a[R] > x )R-- ; else L++; } }
第13题:
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};