百度面试的一道概率方面算法题

题:

给你一个字符串(可能有几亿个字符),给定一个特殊的字符'a',再给定一个可以产生0和1的随机数发生器,然后让你写一个函数,等概率地返回'a'的一个索引(就是'a'在字符串中的位置,比如字符串为 aaba,那么a的索引为{0, 1, 3},等概率地返回0、1或者3)

 

想:

最简单的想法:这个如果产生随机数,再把该随机数哈希到字符串长度范围内,再把得到的哈希值作为下标去看对应的字符满足不满足条件,满足条件则返回下标,不满足条件的话重新随机。缺点——如果满足条件的字符很少,那么完全不靠谱!

稍微容易想到的方法:遍历这个字符串,对满足条件的下标建立索引,然后根据索引大小产生随机数,随机访问索引,返回索引所对应的下标值。这个可以有,但是也有明显缺点——如果满足条件的字符很多,那么索引很大,占用大量存储!

最后就是完美的解答了:

 

答:

#include  < sstream >
#include 
< iostream >
#include 
< string >
#include 
< time.h >

using   namespace  std;

int  given_rand()
{
    
return  rand()  %   2 ;
}

unsigned 
int  my_rand()
{
    
int  i, result;
    
for ( i  =   0 , result  =   0  ; i  <   32  ; i ++  )
    {
        result 
<<=   1 ;
        result 
+=  given_rand();
    }
    
return  result;
}

int  main()
{    
    
int  index  =   0 , cnt  =   0 ;
    stringstream strstring(
" aabbbaaabbbbabbbbabbbbbbbbbbbaabbbbbbbbbbbbbbbbbbbbabaaaabbbbbbbbbbbbbbaaabbbbbbbbbbbb " );
    
int  ret  =   0 ;
    
char  c;

    srand(time(NULL));
    
while  (strstring  >>  c)
    {
        index
++ ;
        
if  (c  ==   ' a ' ) {
            
++ cnt;
            
            
int  rr  =  my_rand()  %  (cnt);            
            
if  (rr  <   1 )
                ret 
=  index;
        }
        
    }
    cout 
<<  ret;
    
return   0 ;
}

 

转载于:https://www.cnblogs.com/DeadKnight/archive/2010/06/21/1762190.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值