迅雷2010校园招聘深圳大学第二次笔试答案

来源:互联网 发布:linux grep 竖线 编辑:程序博客网 时间:2024/04/29 19:11

一. 有一副牌编号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;
}