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