http://hi.baidu.com/alex%BA%E9%C1%C1/blog/item/3b19f4fcc17bdf1c09244d8e.html
1、52张扑克牌分发给4人,每人13张,要求保证随机性。已有随机整数生成函数rand(),但开销较大。请编写函数实现
void deal(int a[],int b[],int c[],int d[]),扑克牌用序号0-51表示,分别存在大小为13的a,b,c,d四个数组中,
要求尽可能高效。
我的思路是:保证随机性无非就是保证每张牌都有可能被任意一个人获得,简单的是直接没发一张牌调用一次随机函数
,这样效率低。我认为我们可以从结果出发,不去关注发牌的方式。最终每人都得到13张牌,我们先把牌标号0-51,并
按序存入数组array中。其中mod4==0位置上的牌将发给a,mod4==1位置上的牌将发给b,mod4==2位置上的牌将发给c,
mod4==3位置上的牌将发给d。这样我们只需要对array数组中数的进行随即调整,就能保证最终发牌结果的随机性了。
可以mod4==0位置上的所有数与通过随机函数产生的位置上的数进行调换,总共调用13次随机函数,而且保证任意13张
牌都有可能被a拿到,b,c,d也是。具体程序就不写了,不知道这种想法是不是与出题者的意图相符。
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的元素的值,并返回。
这个没想出更好的方法。
有兴趣的朋友可以和我交流一下,共同进步!