笔试练习一

来源:互联网 发布:淘宝联盟查看pid 编辑:程序博客网 时间:2024/05/18 00:59

1.实现一个Memmcpy函数(重要的是要考虑到内存重叠的情况)

void *Memorycpy(void *dst, const void *src, size_t n){if (dst == NULL || src == NULL){return NULL;}char*Psrc = (char*)src;char*Pdst = (char*)dst;if (dst > src){Psrc += n - 1;Pdst += n - 1;for (int i = 0; i < n; ++i){*Pdst-- = *Psrc--;}}else{for (int i = 0; i < n; ++i){*Pdst++ = *Psrc;}}return dst;}int main(){char  a[10] = "123456";cout << (char*)Memorycpy(&a[4], &a[3], 2) << endl;return 0;}


2.给定一副扑克牌和一个随机函数,设计一个洗牌算法


#include<iostream>#include<stdlib.h>using namespace std;void Shuffle(int arr[],int n){  if(arr == NULL)       {      return ;        }     int i=0;   for(;i<n;++i)     {    int j= rand()%(n-i) + i;    std::swap(arr[i],arr[j]);     }}int main(){srand((unsigned)time(0));int arr[52]={0};int i=0;for(;i<52;++i){arr[i]=i+1;}Shuffle(arr,52);for(i=0;i<52;++i){ cout<<arr[i]<<" ";}cout<<endl;return 0;}<span style="font-size:14px;"></span>

3.在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。

给定一个整数n,请返回n位的格雷码,顺序为从0开始。

题目给的n代表位数而不是一个整数,格雷码的n个位数意味着有2的n次方个二进制数,每个二进制数为n位,
每个二进制数相比,都只有一位二进制码不相同;
比如n=1,{0,1};n=2,{00,01,11,10};n=3,{000,001,011,010,110,111,101,100} n=4...........n=1000........


void gray(vector<string>&v, int bit, int n){if (bit == n){return;}vector<string> tmp;for (int i = 0; i < v.size(); ++i){tmp.push_back("0" + v[i]);}for (int i = v.size() - 1; i >= 0; --i){tmp.push_back("1" + v[i]);}v.swap(tmp);gray(v, bit + 1, n);}vector<string> getGray(int n){vector<string> v;v.push_back("0");v.push_back("1");if (n != 1){gray(v, 1, n);}return v;}int main(){vector<string> vv = getGray(3);for (int i = 0; i < vv.size(); ++i){cout << vv[i].c_str() << " ";}cout << endl;return 0;}



1 0
原创粉丝点击