笔面试题目

笔面试记录

1、对一个指针*str,不使用另外的变量,不许使用系统函数求出该字符串的长度。

一开始时候想到一个方法就是指针不断指向下一个,直至为空,然后用一个变量不断加一,最后就可以得到长度了,但是,还是需要一个变量来存储,不满足条件。
大概伪码如下:

int i=0;
while(str->next!=null){
    i++;
}

很遗憾,这么写的话远远达不到面试的期望,其实这道题主要考察对C++中strlen()函数的理解,strlen的源码如下:

size_t strlen(const char *str)
//strlen不做内存非法判断,如果是NULL,会core。
{
    const char *eos=str;
    while(*eos++);
    return (eos-str-1);
}

由于不能使用变量,所以修改一下:
方法一:

int strlen(const char *str)
{
   if('\0'==*str)
       return 0;
   else
       return strlen(str+1)+1;
}

方法二:

int strlen(const char *str)
{
   return *str?(strlen(str+1)+1):0;
}

面试官问这种题目也不知道是出于一种怎样的考量,像脑筋急转弯一样。

2、多个用户同时操作一条数据,要修改/删除数据的内容,如何保证数据的准确性?

举个例子:数据库中一个用户表user表,里面包括name(名字)、sex(性别)、age(年龄)等信息,现在有个信息:
name=张三;sex=男;age=20;
现在HR1修改张三的sex为女,而同时HR2也打开了修改张三信息的界面,并把张三的年龄修改成22,这时候HR1先提交,紧接着HR2提交,最后理想的结果应该是:
name=张三;sex=女;age=22;
但是最后的实际结果却是:
name=张三;sex=男;age=22.
这就是多用户同时修改一条数据时候会出现的bug了,这种问题属于特殊情况,但是还是在软件开发中需要考虑的问题。
解决方案一:
在表中添加一个字段lastupdatetime,记录最新一次修改信息的时间,比如起初的lastupdatetime是2016/11/11 11:11。
这时候HR1修改了张三的性别,同时在她进入修改界面时候就获得了lastuodatetime属性值,修改时候加上where lastupdatetime=”2016/11/11 11:11”,表示当前数据就是最新的数据,修改了数据之后,这时候数据变为:
name=张三;sex=女;age=20;lastupdatetime="2016/11/11 12:10"。数据修改成功了。
这时候HR2也打开了这条数据,想要修改这条数据,他修改年龄之后提交进行where lastupdatetime=”2016/11/11 11:11”,结果发现和数据库中的lastupdatetime不相等,这时候就会导致插入不了,捕获一下这个条件,这时候告诉用户:你修改的数据已经被修改了,请重新刷新后修改再修改数据。
解决方案二:
在更新数据时候将其他所有数据都加入where判断中,旧值和新值进行判断,不一致就报错,这个在字段比较多的时候就比较麻烦了,效率降低不少。
解决方案三:
设置同步锁,在一个用户打开这个数据要修改的时候,将这条数据锁上,这时候只能查询不能修改,不过感觉这样的操作有点不人性化,用户体验不好。

3、二叉树的层次遍历,逐层打印出二叉树。

这个问题不难,以前在学校也学过,只不过对先序、中序和后序遍历记得比较多,对层次遍历忘记的差不多了,回来之后搜了下往上的方法,有一个觉得比较好,贴一下代码。这里加入了一个队列保存需要打印的节点,感觉代码简洁,容易看懂,还挺不错的。

//层次遍历
void LevelOrder(BiTree T){
    BiTree p = T;
    //队列
    queue queue;
    //根节点入队
    queue.push(p);
    //队列不空循环
    while(!queue.empty()){
        //对头元素出队
        p = queue.front();
        //访问p指向的结点
        printf("%c ",p->data);
        //退出队列
        queue.pop();
        //左子树不空,将左子树入队
        if(p->lchild != NULL){
            queue.push(p->lchild);
        }
        //右子树不空,将右子树入队
        if(p->rchild != NULL){
            queue.push(p->rchild);
        }
    }
}

4、三次握手、四次挥手协议
笔面试题目_第1张图片

你可能感兴趣的:(笔试面试)