科大讯飞笔试题:互相踢人游戏

来源:互联网 发布:股票行情实时数据 编辑:程序博客网 时间:2024/06/07 08:22
输入为一个字符串和这个字符串的长度,
实现的功能:例如字符串LRRLRL,L朝左,R朝右,类似于两个人,面面相对,其中一个人可以把另外一个人踹出队伍,每次只有一对人可以踢出对方,不能很多人一起操作,求最后最少可以留下多少人?
举例过程:LRRLRL->LRLRL->LRRL->LRL->LR(或者LL)
则最后最多剩下两人
方法:只有RL可以互相踢出对方,一共四种情况RRLR留下L;  RRLL留下L;LRLL留下R;  LRLR留下R  
那么如何退出递归呢?
思路一:在递归的最后(在那里递归应该结束了),定义一个return函数,问题:只是结束了那一个递归,上面的递归还在继续,core(s,s.size());这个是结束了,但是还需要继续往下面执行,出现问题
思路2:定义一个flag变量,当应该结束的时候,将flag置为true,那么每次 循环的时候就会直接退出,然而,同上面的问题一样,core(s,s.size());这个是结束了,但是还需要继续往下面执行,这样就造成了不可知的错误,本题中最后的结果是LR,然后,core(s,s.size())结束后,重新回到上次的循环中len的值变为了3,这样就访问过界了。
bool flag =false;
void core(string &s,int len){
   // if(flag) return ;
        for (int i=0;i<len-1;i++)
        {
            if(i==0){
                if(s[i]=='R' &&s[i+1]=='L'){
                    for(int j=i+1;j<len-1;j++)  s[j]=s[j+1];
                    s = s.substr(0,len - 1);
                    core(s,s.size());
                    if(flagreturn ;
                }
            }
            if(i != 0){
                if (s[i]=='R' &&s[i+1]=='L'){
                    if (s[i-1]=='R'){
                        for(int j=i;j<len-1;j++)  s[j]=s[j+1];
                        s = s.substr(0,len - 1);
                        core(s,s.size());
                        if(flagreturn ;
                    }
                    if (s[i-1]=='L'){
                        for(int j=i+1;j<len-1;j++)  s[j]=s[j+1];
                        s = s.substr(0,len - 1);
                        core(s,s.size());
                        if(flagreturn ;
                    }
                }
            }
        }
       // return ;
        flag = true;        
}
原创粉丝点击