迅雷2010校园招聘深圳大学第二次笔试答案
2009-09-30 22:05
351 查看
一. 有一副牌编号0~51,请把这副牌尽可能随机的发到4个人手里
注1:已经有rand()函数可以调用,但是rand()函数开销较大,请尽量少调用
a,b,c,d分别是13个元素的1维数组
函数原型 void deal( int[] a, int[] b, int[] c, int[] d );
程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int card[52];
// 随机生成 [l, r) 之间的整数
// 当 r > RAND_MAX 时应返回: l + (RAND_MAX * rand() + rand()) % (r - l);
int rand_range(int l, int r)
{
return (l + rand() % (r - l));
}
void swap(int &x, int &y)
{
int t = x;
x = y;
y = t;
}
void deal(int a[], int b[], int c[], int d[])
{
int *arr[4];
arr[0] = a; arr[1] = b;
arr[2] = c; arr[3] = d;
int i;
for (i = 0; i < 52; ++i)
card[i] = i;
srand(time(NULL));
// 随机洗牌
for (i = 0; i < 52; ++i)
{
swap(card[i], card[rand_range(i, 52)]);
}
// 发牌
for (i = 0; i < 13; ++i)
{
for (int j = 0; j < 4; ++j)
arr[j][i] = card[i * 4 + j];
}
}
void print(int arr[], int size)
{
for (int i = 0; i < size; ++i)
printf("%d ", arr[i]);
printf("/n**********/n");
}
int main()
{
int a[13], b[13], c[13], d[13];
deal(a, b, c, d);
print(card, 52);
print(a, 13);
print(b, 13);
print(c, 13);
print(d, 13);
return 0;
}
二. 实现字符串反转的c库函数 char* strrev(char* string)
注1:不可利用其他库函数,算法尽量高效、占用空间少。
程序:
#include <stdio.h>
char* find_end(char *string)
{
for (; *string != '/0'; ++string);
return string;
}
char* strrev(char *string)
{
char *end = find_end(string);
char *res = string;
while (string < end)
{
char c = *string;
*string++ = *--end;
*end = c;
}
return res;
}
int main()
{
char string[] = "Hello, World!";
char *res = strrev(string);
printf("%s/n", res);
return 0;
}
三. 有10亿个数,这些数的值都在0~1000万之内。实现接口 get_bigger_count( unsigned value )
输入一个值value,返回这10亿个数中比value值大的数的数目。
class order_calculate
{
public:
order_calculate();
~order_calculate();
unsinged get_bigger_count( unsigned value )
}
注1:get_bigger_count接口会被频繁的调用,实现要高效
注2:可以自己往内部任意添加变量和接口
注3:有个现成的接口 unsigned get_value_by_index( int idx ) 可以调用,该接口返回指定索引的value值
比如 get_value_by_index( 100 ), 返回10亿个数中第100个数的值。该接口开销较大,尽量少调用。
程序:
#include <stdio.h>
#include <string.h>
const int MAX_N = 100;
const int MAX_VAL = 1000;
unsigned arr[MAX_N];
// 测试用
unsigned get_value_by_index(int idx)
{
return arr[idx];
}
class order_calculate
{
public :
order_calculate()
{
int i;
m_pCnt = new int[MAX_VAL + 1];
memset(m_pCnt, 0, sizeof(m_pCnt));
// 统计数值 val 出现的次数
for (i = 0; i < MAX_N; ++i)
{
++m_pCnt[get_value_by_index(i)];
}
// 不小于 i 的数的个数为: m_pCnt[i] = sigma{m_pCnt[j],
// i <= j < MAX_VAL};
for (i = MAX_VAL - 1; i >= 0; --i)
m_pCnt[i] += m_pCnt[i + 1];
}
~order_calculate()
{
delete [] m_pCnt;
}
unsigned int get_bigger_count(unsigned value)
{
if (value < 0)
return m_pCnt[0];
else if (value >= MAX_VAL)
return 0;
// 大于 value 的数的个数为 m_pCnt[value + 1];
return m_pCnt[value + 1];
}
private :
int *m_pCnt;
};
int main()
{
return 0;
}
注1:已经有rand()函数可以调用,但是rand()函数开销较大,请尽量少调用
a,b,c,d分别是13个元素的1维数组
函数原型 void deal( int[] a, int[] b, int[] c, int[] d );
程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int card[52];
// 随机生成 [l, r) 之间的整数
// 当 r > RAND_MAX 时应返回: l + (RAND_MAX * rand() + rand()) % (r - l);
int rand_range(int l, int r)
{
return (l + rand() % (r - l));
}
void swap(int &x, int &y)
{
int t = x;
x = y;
y = t;
}
void deal(int a[], int b[], int c[], int d[])
{
int *arr[4];
arr[0] = a; arr[1] = b;
arr[2] = c; arr[3] = d;
int i;
for (i = 0; i < 52; ++i)
card[i] = i;
srand(time(NULL));
// 随机洗牌
for (i = 0; i < 52; ++i)
{
swap(card[i], card[rand_range(i, 52)]);
}
// 发牌
for (i = 0; i < 13; ++i)
{
for (int j = 0; j < 4; ++j)
arr[j][i] = card[i * 4 + j];
}
}
void print(int arr[], int size)
{
for (int i = 0; i < size; ++i)
printf("%d ", arr[i]);
printf("/n**********/n");
}
int main()
{
int a[13], b[13], c[13], d[13];
deal(a, b, c, d);
print(card, 52);
print(a, 13);
print(b, 13);
print(c, 13);
print(d, 13);
return 0;
}
二. 实现字符串反转的c库函数 char* strrev(char* string)
注1:不可利用其他库函数,算法尽量高效、占用空间少。
程序:
#include <stdio.h>
char* find_end(char *string)
{
for (; *string != '/0'; ++string);
return string;
}
char* strrev(char *string)
{
char *end = find_end(string);
char *res = string;
while (string < end)
{
char c = *string;
*string++ = *--end;
*end = c;
}
return res;
}
int main()
{
char string[] = "Hello, World!";
char *res = strrev(string);
printf("%s/n", res);
return 0;
}
三. 有10亿个数,这些数的值都在0~1000万之内。实现接口 get_bigger_count( unsigned value )
输入一个值value,返回这10亿个数中比value值大的数的数目。
class order_calculate
{
public:
order_calculate();
~order_calculate();
unsinged get_bigger_count( unsigned value )
}
注1:get_bigger_count接口会被频繁的调用,实现要高效
注2:可以自己往内部任意添加变量和接口
注3:有个现成的接口 unsigned get_value_by_index( int idx ) 可以调用,该接口返回指定索引的value值
比如 get_value_by_index( 100 ), 返回10亿个数中第100个数的值。该接口开销较大,尽量少调用。
程序:
#include <stdio.h>
#include <string.h>
const int MAX_N = 100;
const int MAX_VAL = 1000;
unsigned arr[MAX_N];
// 测试用
unsigned get_value_by_index(int idx)
{
return arr[idx];
}
class order_calculate
{
public :
order_calculate()
{
int i;
m_pCnt = new int[MAX_VAL + 1];
memset(m_pCnt, 0, sizeof(m_pCnt));
// 统计数值 val 出现的次数
for (i = 0; i < MAX_N; ++i)
{
++m_pCnt[get_value_by_index(i)];
}
// 不小于 i 的数的个数为: m_pCnt[i] = sigma{m_pCnt[j],
// i <= j < MAX_VAL};
for (i = MAX_VAL - 1; i >= 0; --i)
m_pCnt[i] += m_pCnt[i + 1];
}
~order_calculate()
{
delete [] m_pCnt;
}
unsigned int get_bigger_count(unsigned value)
{
if (value < 0)
return m_pCnt[0];
else if (value >= MAX_VAL)
return 0;
// 大于 value 的数的个数为 m_pCnt[value + 1];
return m_pCnt[value + 1];
}
private :
int *m_pCnt;
};
int main()
{
return 0;
}
相关文章推荐
- 迅雷2010校园招聘吉林大学第二次笔试答案
- 迅雷2010校园招聘四川大学第二次笔试答案
- 迅雷2010校园招聘吉林大学第二次笔试题
- 迅雷2010校园招聘吉林大学第二次笔试题
- 2014迅雷校园招聘笔试题答案
- 2014迅雷校园招聘笔试题答案
- 迅雷校园招聘笔试题及答案解析(部分)
- 搜狐2010校园招聘第一站北邮笔试题(转) 以及 本人做的部分答案
- 阿里巴巴2010校园招聘笔试题摘录(附答案)
- 2014迅雷校园招聘笔试题答案
- 2014迅雷校园招聘笔试题答案
- 2014迅雷校园招聘笔试题答案
- 2014迅雷校园招聘笔试题答案
- 2014迅雷校园招聘笔试题答案
- 2014迅雷校园招聘笔试题答案
- 2011-10-15腾讯校园招聘笔试题目与参考答案
- 百度2013校园招聘笔试题 个人答案分析
- 阿里巴巴2015秋季校园招聘前端开发工程师在线笔试题及答案
- 笔试 - 2014创新工场涂鸦移动校园招聘测试题 及 答案
- 迅雷2009年9月20日校园招聘笔试题【节选】