⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 科大的google笔试.txt

📁 google的面试题
💻 TXT
字号:
1. typedef struct {

            Node * node;

}Tree;

 

typedef struct {

           Node * left;

           Node * right;

}Node;

 

请写出深拷贝函数:Tree * deepCopy(Tree *tree);

#include "StructTree.h"

#include <malloc.h>

#include<iostream.h>

Node * copyTree(Node *node);

 
Me的答案:
//之所以分开两个函数是因为 Tree(相当于根)与node是不同的 Tree相单独处理一下
Tree *deepCopy(Tree *tree)
{
	if (tree == NULL)
	{
		return NULL;
	}
	Tree *newtree = new Tree;
	Tree.node = new Node;
	Tree.node->left = copyTree(tree->node->left);
	Tree.node->right = copyTree(tree->node->right);
	retrun newtree;
}

Node *copyTree(Node *oldnode)
{
	Node *newnode;
	if (odlnode== NULL)
	{
		return NULL;
	}
	newnode = New Node;
	newnode->left = copyTree(oldnode->left);
	newnode->right = copyTree(oldnode->right); 
	return newnode;
}


//网上答案 我觉得有问题
Tree *deepCopy(Tree *tree)
{
	if( !tree ) return NULL;

 Tree *re = new Tree;
re->node = tree->node;

re->node->left = copyTree(tree->node->left);

re->node->right = copyTree(tree->node->right);

return re;
}


Node

 * copyTree(Node *node)

{
if( !node ) return NULL;

Node *re = new Node;
re->left = copyTree(node->left);
re->right = copyTree(node->right);

return re;
}

 

void main()

{

   Node *node=new Node;

   node->left=NULL;

   node->right=NULL;

 Tree *tree=new Tree,*tree1=new Tree;

tree->node=node;

tree1=deepCopy(tree);

 

}

 
//据说STL中的函数
2. 输入一个整型数组,对该数组进行随机排序,写出该函数
void randomShuffle(int *a, int len);
可以使用随机函数发生器
int random(int N); //假设是完全的随机函数,返回值是0 - N-1的整数

Me的思路:
void randomShuffle(int *a, int len)
{
 	int num[len];
	int pos;
	for (i=0; i<len; i++)
	{
		num[i] = -1;
	}
	
	for (i=0; i<len; i++)
	{
		pos = random(len+1);
		if (num[pos] == -1)
			num[pos] = len[i];
		else
			i--; 
	}
}
 

法2
void randomShuffle(int *a, int len)
{	
	int i;
	for (i=0; i<len; i++)
	{
		swap(a[i], a[randon(len+1)]);
	}
}


i位的与随机位上的数换
好处:空间复杂度小


3. N个人排成一圈,指定第一个人,去除他,然后跳着一人去除第3人,以次类推,最后
的那一人获胜。给定这N个人和第一个人的位置,你该如何选取位置才会获胜。
让你写最优算法,并计算时间和空间复杂度。不要求写出代码,解释算法即可。

法1:
去掉第一人后,成为真正的约瑟夫环。
设k = N - 1;
公式:
J(K) = 2J(K/2) - 1	//K为偶
J(K) = 2J(K/2) + 1        //K为奇
算出的J(K) + 1即是答案 (加1是为还原回来的序号)

法2:
去掉第一人后,成为真正约瑟夫环。
f[0] = 0
f[i] = (f[i-1] + m) % i
m是步长 i是人数 i的初值从N开取
算出的最终值仍要+1得答案









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -