黑马程序员技术交流社区

标题: 遇到这样的题我也是醉了!!! 求解答过程啊 [打印本页]

作者: 杨凯瑞    时间: 2015-11-13 19:57
标题: 遇到这样的题我也是醉了!!! 求解答过程啊
话说大诗人李白,一生好饮。幸好他从不开车。

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

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

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

    请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
作者: wx_Cr3Z7mRM    时间: 2015-11-13 20:06
踩一下来来来
作者: 田浩然    时间: 2015-11-13 20:36
这问题。。。。。。。。。。。我不会告诉你我不会的
作者: 还不够    时间: 2015-11-13 20:41
算术不好啊
作者: 你是对的    时间: 2015-11-13 21:55
思路是,用一个变量存储次数,用控制语句筛选有符合要求的就+1,最后输出就行了
作者: 杨凯瑞    时间: 2015-11-14 21:28
还不够 发表于 2015-11-13 20:41
算术不好啊

真心不好做啊!!难
作者: oup    时间: 2015-11-14 21:45
求大神来解答!
作者: 轻寒漠漠    时间: 2015-11-14 22:13
额,标题是提问结束这是什么情况
作者: 醉叶惜秋    时间: 2015-11-14 22:31
进来是看大神回复的
作者: geqiandesiyu    时间: 2015-11-15 00:06
0.0你是注定的超级黑马程序员,我看好你
作者: 253186803    时间: 2015-11-15 00:18
不知道啊 !!
作者: syb012    时间: 2015-11-24 22:24
本帖最后由 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


作者: olivec    时间: 2016-1-29 16:24
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);
        }
}

作者: 洋葱头头    时间: 2016-1-29 16:49
syb012 发表于 2015-11-24 22:24
写完了,求大神们帮我检查一下

6666666666666
作者: 悠悠天下    时间: 2016-1-29 21:49
都好厉害  学习一下
作者: 梁志斌    时间: 2016-1-31 00:08
这首诗可以的
作者: yi651312197    时间: 2016-1-31 22:34
{:2_43:}  这题  哎
作者: Mayer    时间: 2016-2-1 23:54
一下子没看懂,收藏明天看




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2