今天去笔霸,hr没怎么卡,等了一会就让入座了,还是有好几个面熟的研究生,刚开始找工作的时候见过的,竟有一种亲切的感觉,呵呵.题不多,多是基础的c,数据结构算法等,有几道题不太熟,特此记下,

一,sscanf(),中的正则表达式的使用:  
    sscanf() - 从一个字符串中读进与指定格式相符的数据.  
    函数原型:  
        Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );  
        int scanf( const char *format [,argument]... );  
    说明:
        sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。  
        其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}  
    注:  
        1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)  
        2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。  
        3、width表示读取宽度。  
        4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。  
        5、type :这就很多了,就是%s,%d之类。  
        6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值  
    支持集合操作:  
        %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)  
        %[aB'] 匹配a、B、'中一员,贪婪性  
        %[^a] 匹配非a的任意字符,贪婪性
    例子:  
        1. 常见用法。  
        char buf[512] = ;  
        sscanf("123456 ", "%s", buf);  
        printf("%s\n", buf);  
        结果为:123456  
        2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。  
        sscanf("123456 ", "%4s", buf);  
        printf("%s\n", buf);  结果为:1234  
        3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。  
        sscanf("123456 abcdedf", "%[^ ]", buf);  
        printf("%s\n", buf);  
        结果为:123456  
        4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
      sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);  
        printf("%s\n", buf);  
        结果为:123456abcdedf  
        5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
       sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);  
        printf("%s\n", buf);  
        结果为:123456abcdedf  
        6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中  
        sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);  
        printf("%s\n", buf);  
        结果为:12DDWDFF  
        7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
      sscanf(“hello, world”, "%*s%s", buf);  
        printf("%s\n", buf);  
        结果为:world  
        %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了  
        如果没有空格则结果为NULL。  
        sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.
   



二,strncpy时,如里原串的目的串相同.
    char buf[512] = {0};
    sscanf("12345", "%s", buf);
    strncpy(buf,buf,4);
    printf("%s\n",buf);
  这首题我考虑多了,其实strncpy()不会自动检查原串和目的串是否相同,
  所以结果应该是:12345

三,已知两个循环链表表头pHeadA,pHeadB,让你删除两链表中相同data的结点.


四,xml的三种解释.

五,数据库的事务死锁问题.

     死锁是一个很重要的话题。在事务和锁的使用过程中,死锁是一个不可避免的现象。在两种情况下,可以发生死锁。第一种情况是,当两个事务分别锁定了两个单独的对象,这时每一个事务都要求在另外一个事务锁定的对象上获得一个锁,因此每一个事务都必须等待另外一个事务释放占有的锁,这时,就发生了死锁。这种死锁是最典型的死锁形式。在同一时间内有两个事务A和B,事务A有两个操作:锁定表part和请求访问表supplier;事务B也有两个操作:锁定表supplier和请求访问表part。结果,事务A和事务B之间发生了死锁死锁的第二种情况是,当在一个数据库中时,有若干个长时间运行的事务执行并行的操作,当查询分析器处理一种非常复杂的查询例如连接查询时,那么由于不能控制处理的顺序,有可能发生死锁现象。

  当发生死锁现象时,系统可以自动检测到,然后通过自动取消其中一个事务来结束死锁。在发生死锁的两个事务中,根据事务处理时间的长短作为规则来确定他们的优先级。处理时间长的事务具有较高的优先级,处理时间较短的事务具有较低的优先级。在发生冲突时,保留优先级高的事务,取消优先级低的事务。


如何避免死锁
1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;
2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
3 优化程序,检查并避免死锁现象出现;
4 .对所有的脚本和SP都要仔细测试,在正式版本之前。
5 所有的SP都要有错误处理(通过@error)
6 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁




面试:没怎么准备,结果一踏糊涂.
让写一段代码,计算1000的阶乘有多少位.
没印象了,在网上找到了解决办法.

lg(100!)   =   lg(100)   +   lg(99)   +   ……   +   lg(2)   +   lg(1)  
  这个试子可以计算出lg(100!)的值。  
   
  存在一个整数N,使:  
  10^N     (这里的10^N代表10的N次方)  
  可知N就是100!的位数。  
   
  设100!   =   10^x,则:N     于是,把100!   =   10^x两边取对数得:  
  lg(100!)   =   lg(10^x),可得:  
  x   =   lg(100!)   /   lg10,可得:  
  N   =   floor(x),(N就是x的整数部分)  
   
  我上面说的方法至少在1000!以内是正确的,  
  这点我可以保证。  
   
  曾有人和我说过一个非简单的方法,我一时想不起来,  
  想起来再告诉你。
http://topic.csdn.net/t/20050714/10/4143630.html
http://www.slyar.com/blog/high-precision-factorial.html

Stirling's   Series 斯特灵公式:
http://zh.wikipedia.org/zh-cn/%E6%96%AF%E7%89%B9%E9%9D%88%E5%85%AC%E5%BC%8F
http://apprentice.blogbus.com/logs/45566290.html

09-13 22:12