A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

话说大诗人李白,一生好饮。幸好他从不开车。

    一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

    无事街上走,提壶去打酒。
    逢店加一倍,遇花喝一斗。

    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

    请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

17 个回复

正序浏览
一下子没看懂,收藏明天看
回复 使用道具 举报
{:2_43:}  这题  哎
回复 使用道具 举报
这首诗可以的
回复 使用道具 举报
都好厉害  学习一下
回复 使用道具 举报
syb012 发表于 2015-11-24 22:24
写完了,求大神们帮我检查一下

6666666666666
回复 使用道具 举报
public class Test6 {

        public static void main(String[] args) throws Exception {
                print(2, 5, 10, new StringBuilder());
        }
        public static void print(int wine,int shop,int flower,StringBuilder builder){
                if(wine==0&&shop==0&&flower==0&&builder.charAt(builder.length()-1)=='b'){
                        System.out.println(builder);
                }else if(shop<0||flower<0) {
                        return;
                }
                print(wine*2, shop-1, flower, builder.append('a'));
                builder.deleteCharAt(builder.length()-1);
                print(wine-1, shop, flower-1, builder.append('b'));
                builder.deleteCharAt(builder.length()-1);
        }
}
回复 使用道具 举报
syb012 中级黑马 2015-11-24 22:24:44
12#
本帖最后由 syb012 于 2015-11-24 22:46 编辑

写完了,求大神们帮我检查一下


思路:
* 1、可以用所有15位数以内的二进制数来代替所有ab随机出现的情况
* 2、找出当中有5个a和10个b的情况,就是这个二进制数每个位置相加结果是5,其中用1代表a,0代表b
* 3、把不够15位的二进制字符串,在高位用0补齐
* 4、依次读取最后得到的字符串,遇到1,加倍,遇到0,减一。把最后结果是0的字符串放到一个集合中。
* 5、把二进制字符串中的1、0分别用a、b替换
import java.util.ArrayList;

public class Test_3 {

        public static void main(String[] args) {
               
                ArrayList<String> list=new ArrayList<String>();
                list=method_1(list);//算出有5个1和10和0的15位字符串放入一个集合中。
                list=method_2(list);//在前面的基础上算出最后位是0的所有字符串放入一个集合中
                list=method_3(list);//前面的基础上,算出所有遇'1'加倍遇'0'减1后结果是0的字符串,并放入一个集合中
                list=method_4(list);//把二进制字符串中的1、0分别用a、b替换,放到一个集合中
               
                System.out.println("所有可能方案的个数是"+list.size()+"个如下:");
                for(String s:list){
                        System.out.println(s);
                }

        }
        
        //把二进制字符串中的1、0分别用a、b替换,放到一个集合中
        private static ArrayList<String> method_4(ArrayList<String> list) {
                ArrayList<String> list2=new ArrayList<String>();
                for(String s:list){
                        s=s.replaceAll("1", "a");
                        s=s.replaceAll("0", "b");
                        list2.add(s);
                }
                return list2;
        }

        //前面的基础上,算出所有遇'1'加倍遇'0'减1后结果是0的字符串,并放入一个集合中
        private static ArrayList<String> method_3(ArrayList<String> list) {
                ArrayList<String> list2=new ArrayList<String>();
                for(String s:list){
                        int n=2;
                        char[] ch=s.toCharArray();
                        for(int i=0;i<15;i++){
                                if(ch=='1')
                                        n=n*2;
                                else
                                        n=n-1;                                
                        }
                        if(n==0)
                                list2.add(s);
                }
               
                return list2;
        }

        //在前面的基础上算出最后位是0的所有字符串放入一个集合中
        private static ArrayList<String> method_2(ArrayList<String> list) {
                ArrayList<String> list2=new ArrayList<String>();
                for(String s:list){
                        char[] ch=s.toCharArray();
                        if(ch[14]=='0')
                                list2.add(s);
                }
               
                return list2;
        }

        //算出有5个1和10和0的15位字符串放入一个集合中。
        private static ArrayList<String> method_1( ArrayList<String> list)
        {
                double d=Math.pow(2,15)-1;
                int x=(int) d;
                for(int i=0;i<=x;i++)
                {
                        String s=Integer.toBinaryString(i);
                        char[] ch=s.toCharArray();
                        int sum=0;
                        for(int j=0;j<ch.length;j++)
                        {
                                
                                sum+=ch[j]=='1'?1:0;
                        }
                        if(sum==5){
                                int len=s.length();
                                if(len<15)
                                {
                                        for(int g=0;g<15-len;g++)
                                        {
                                                s="0"+s;
                                        }                                       
                                }
                                list.add(s);                                
                        }
                                
                }
               
                return list;
        }


}



运行结果是:所有可能方案的个数是14个如下:
bababaababbbbbb
babaabbabbabbbb
babaababbbbbabb
baabbbaabbabbbb
baabbabbbaabbbb
baabbabbabbbabb
baababbbbbababb
abbbabaabbabbbb
abbbaabbbaabbbb
abbbaabbabbbabb
abbabbbabaabbbb
abbabbbaabbbabb
abbabbabbbababb
ababbbbbabababb

回复 使用道具 举报
不知道啊 !!
回复 使用道具 举报
0.0你是注定的超级黑马程序员,我看好你
回复 使用道具 举报
进来是看大神回复的
回复 使用道具 举报
额,标题是提问结束这是什么情况
回复 使用道具 举报
oup 中级黑马 2015-11-14 21:45:05
7#
求大神来解答!
回复 使用道具 举报

真心不好做啊!!难
回复 使用道具 举报
思路是,用一个变量存储次数,用控制语句筛选有符合要求的就+1,最后输出就行了
回复 使用道具 举报
算术不好啊
回复 使用道具 举报
这问题。。。。。。。。。。。我不会告诉你我不会的
回复 使用道具 举报
踩一下来来来
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马