100-83

83.第3组百度面试题
1.今年百度的一道题目
百度笔试:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。
要求:空间复杂度O(1),时间复杂度为O(n)。

2.百度笔试题
用C语言实现函数void * memmove(void *dest, const void *src, size_t n)。
memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。
分析:
由于可以把任何类型的指针赋给void类型的指针
这个函数主要是实现各种数据类型的拷贝。


思路:

1.在100-54中已经讨论过了。

2.

在C/C++标准库函数中存在该函数,它用于将src指向的n个字节的数据拷贝到dest位置。在标准库函数中还存在另外一个函数memcpy,它也用来实现内存拷贝,但它不考虑区间重叠问题,在拷贝过程中可能造成重叠错误。

而memmove则针对上诉问题给出了一定的处理措施来防止拷贝出错:

(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝

(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝

(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

下面给出memmove的具体实现,关于memcpy可参考库函数实现或相关资料。
[cpp]  view plain copy
  1. void *memmove(void *dest,const void *src, size_t n)  
  2. {  
  3.     if (NULL == dest || src == NULL)  
  4.     {  
  5.         cerr<<"NULL pointers!";  
  6.         return NULL;  
  7.     }  
  8.     int step;  
  9.     char *p, *q;  
  10.     if ((char *)src == (char *)dest) {  
  11.         return dest;  
  12.     } else if ((char *)src > (char *)dest) {   
  13.         step = 1;  
  14.         p = (char *)src;  
  15.         q = (char *)dest;  
  16.     } else {  
  17.         step = -1;  
  18.         p = (char *)src + n - 1;  
  19.         q = (char *)dest + n - 1;  
  20.     }  
  21.     for(int i = 0; i != n; ++i) {  
  22.         *q = *p;  
  23.         p += step;  
  24.         q += step;  
  25.     }  
  26.     return dest;  
  27. }  

你可能感兴趣的:(100-83)