笔试练习一

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



你可能感兴趣的:(笔试练习一)