算法面试(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;
};

原文地址:https://www.cnblogs.com/20120125llcai/p/3887402.html