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;
}