面试题


1.链表和数组的区别在哪里? 
2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法? 
3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法? 
4.请编写能直接实现strstr()函数功能的代码。 
5.编写反转字符串的程序,要求优化速度、优化空间。 
6.在链表里如何发现循环链接? 
7.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。 

因为一共有N!种洗牌结果,所以可以等概率地产生一个1-N!之间的随机数x,然后用康托展开的方法,根据x生成对应的排列,即为洗牌结果。
关于康托展开,参考http://baike.baidu.com/view/437641.htm

康托展开源代码(计算排列的编号):洗牌算法要反过来,即根据排列的编号计算排列的内容。
#include <stdio.h>

int fac[] = {1,1,2,6,24,120,720,5040,40320,362880};
unsigned long cantor(int s[], int n) {
    int i,j,temp,num=0;
    for(i=1;i<n;i++){
        temp = 0;
        for(j=i+1;j<=n;j++){
            if(s[j]<s[i])
                temp++;
        }   
        num+=fac[n-i]*temp;
    }   
    return num+1;
}

int main(){
    int x[]={0,1,2,3,5,4};
    printf("%ld\n", cantor(x,5));
    int y[]={0,5,4,3,2,1};
    printf("%ld\n", cantor(y,5));
}





8.写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码 ,编写出一个从字符串到长整形的函数?) 
9.给出一个函数来输出一个字符串的所有排列。 
10.请编写实现malloc()内存分配函数功能一样的代码。 
11.给出一个函数来复制两个字符串AB。字符串A的后几个字节和字符串B的前几个字节重叠。 
12.怎样编写一个程序,把一个有序整数数组放到二叉树中? 
13.怎样从顶部开始逐层打印二叉树结点数据?请编程。 
14.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)? 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值