您的位置:首页 > 其它

迅雷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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: