百度笔试题14

http://hi.baidu.com/alex%BA%E9%C1%C1/blog/item/3b19f4fcc17bdf1c09244d8e.html

152张扑克牌分发给4人,每人13张,要求保证随机性。已有随机整数生成函数rand(),但开销较大。请编写函数实现

 

void deal(int a[],int b[],int c[],int d[]),扑克牌用序号0-51表示,分别存在大小为13ab,c,d四个数组中,

 

要求尽可能高效。

我的思路是:保证随机性无非就是保证每张牌都有可能被任意一个人获得,简单的是直接没发一张牌调用一次随机函数

 

,这样效率低。我认为我们可以从结果出发,不去关注发牌的方式。最终每人都得到13张牌,我们先把牌标号0-51,并

 

按序存入数组array中。其中mod4==0位置上的牌将发给amod4==1位置上的牌将发给bmod4==2位置上的牌将发给c

 

mod4==3位置上的牌将发给d。这样我们只需要对array数组中数的进行随即调整,就能保证最终发牌结果的随机性了。

 

可以mod4==0位置上的所有数与通过随机函数产生的位置上的数进行调换,总共调用13次随机函数,而且保证任意13

 

牌都有可能被a拿到,bcd也是。具体程序就不写了,不知道这种想法是不是与出题者的意图相符。

 

2、将一个字符串逆转,如"hello"变成"olleh",不许调用任何已有的字符串库函数,要求尽量高效,以及占用尽量少

 

的存储空间。

 

程序如下:

#include<iostream>

int main()

{

char str[] = "hello";

int length = 0;

while(str[length] != '/0')

{

   length++;

}

std::cout << str << std::endl;

length++;

char tmp;

int i = 0;

while(i < (int)(length-1)/2)

{

   tmp = str[length-2-i];

   str[length-2-i] = str[i];

   str[i] = tmp;

   i++;

}

std::cout << str << std::endl;

return 0;

}

这个思路既节省运行时间,又没有多余的内存开销。时间上length + length/2,空间只是在原有数组上进行,没占用

 

多余的内存。

 

3、有10亿个无符号整数存储在文件中,取值范围是0-1000万,给定值value返回大于该数的个数。完成以下类函数的实

 

现:

class order_calculator

{

order_calculator();

~order_calculator();

unsigned get_bigger_count(unsigned value);

}

已有函数get_value_by_index(unsigned index)根据index索引值返回值可以调用,但此函数开销较大。

 

这个题先动态申请1000万的int数组,用于记录0-1000万数的出现次数,扫描文件对这个数组元素进行赋值。这些要在构造函数中完成。

析构函数中,动态的释放内存。

get_bigger_count(unsigned value)中,只是查找数组中对应下标大于value的元素的值,并返回。

这个没想出更好的方法。

 

有兴趣的朋友可以和我交流一下,共同进步!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyf31

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值