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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王丽 黑马帝   /  2011-7-27 13:09  /  4797 人查看  /  27 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是一道笔试题,请大家帮解决一下,四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 算法,有意思。

查看全部评分

27 个回复

倒序浏览
应该是8种吧,按2^3种,没算.

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 看题目!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-27 14:21:49
藤椅
()()()()
()()(())           (())()()
()(()())           (()())()
()((()))           ((()))()
(()()())
(()(()))           ((())())
((()()))
(((())))

12种

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 辛苦。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-27 18:50:27
板凳

回复 藤椅 的帖子

敢问此楼,要是3000对括号,那有多少种啊?

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 问得好。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-27 23:11:48
报纸

回复 板凳 的帖子

大哥 大家都在等你的答案呢  你都不解决没人能解决了
回复 使用道具 举报
女侠,你问的问题忒牛了。弄得我一个晚上都在想什么搞,以下是我求出的算法,我个人感觉是对的。但因为太难了我不敢保证100%正确,期待大家一起来验证并提出改进建议,代码如下:[code=java]public class Test {

        /**
         * 功能:四对括号可以有多少种匹配排列方式?
         * @param total匹配的个数
         */
        /**
         * 当我们用0表示左括号,1表示右括号时,发现
         * 1、所有用符号法(0,1)表示的括号排列都是以0开头,以1结束,
         * 2、所有用符号法(0,1)表示的括号排列中0和1的个数都相当即等于括号的个数
         * 3、不是所有符合0 ,1个数相等的排列都是符合要求的,截止任意某个有1的位置,其前面的0的个数必须大于或者等于截止该位置时一的个数。
         * 4、符号法(0,1)表示括号是数列的二进制数最小值是n个"0"加n个1,即01 0011  000111等;
         * 5、根据条件3得出符号法(0,1)表示括号是数列的二进制数最大值是01 0101  010101 等方式;
         * 6、交换数列的任意两个数字不相同的两位数,数列所对应的二进制数大小改变2的倍数
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub        
                //fun(1);
                int n=4;
                System.out.println(n+"组括号匹配的数列有");
                int total=fun(n);
                System.out.println(n+"组括号共有"+total+"个匹配的括号数列");
               
        }
        
        //n表示括号的个数
        public static int  fun(int n){
               
                if(n==1)
                        return 1;
                /*
                 * 匹配二进制数最小值的数列
                 */
                String s1="";
                String s2="";
                for (int i = 0; i <n; i++) {
                        s1+="0";
                        s2+="1";
                }
               
                //得到数列的二进制数最小值的字符串
                String minstr=s1+s2;
                //得到数列的二进制数最小值对应的十进制数
                int min=Integer.parseInt(minstr, 2);
               
                /*
                 * 匹配二进制数最大值的数列
                 */
               
                //得到数列的二进制数最大值的字符串
                String maxstr="";
                for (int i = 0; i < n; i++) {
                        maxstr+="0"+"1";
                }
               
                //得到数列的二进制数最大值对应的十进制数
                int max=Integer.parseInt(maxstr, 2);
                System.out.println(minstr);
               
                /*
                 * 现在开始算符合条件的数列个数
                 */
                int total=0;
                //最大最小都是他本身
                if(max==min)return 1;
               
                //最大最小都不是他本身
                if(max!=min) total=2;//最大最小分别表示一个,
               
                int nextnum=min+2;//由条件6得出加权数是2
               
                //看看 两数之间是否还有匹配的数列
                while (nextnum<max) {
                        String s=Integer.toBinaryString(nextnum);
                        String sub="";
                        //给二进制数补位
                        for (int i = 0; i < 2*n-s.length(); i++) {
                                sub+="0";
                        }
                        s=sub+s;
                        
                        int num=0;//临时变量看0的个数是否等于n
                        
                        //因为已经有条件3推出了最大值,所有下面不需要判断是否符合条件三了
                        for (int i = 0; i < s.length(); i++) {
                                if(s.charAt(i)=='0'){
                                        num++;
                                }
                        }
                        if(num==n){
                                total++;
                                System.out.println(s);
                        }
                        nextnum+=2;////由条件6得出加权数是2
                }
                System.out.println(maxstr);
                return total;
               
        }

}[/code]
运行结果
[code=java]4组括号匹配的数列有
00001111
00010111
00011011
00011101
00100111
00101011
00101101
00110011
00110101
00111001
01000111
01001011
01001101
01010011
01010101
4组括号共有15个匹配的括号数列[/code]
[ 本帖最后由 兰海忠 于 2011-07-28  13:44 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 做算法题目是很有意思的。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-28 13:51:08
7#

回复 地板 的帖子

嗯 你这个不对,所谓匹配就是有括号就要对应的括回。。你再加个几个条件语句就哦拉
回复 使用道具 举报
黑马网友  发表于 2011-7-28 13:55:19
8#

回复 地板 的帖子

给个提示就是0后面必须对应一个1 ,这个1的位置不确定。但是必须在0后

比如你的00011011就不对,则个0可以放在00011101这样就是匹配。。
懂了吗 改一下 就这个程序就哦了

评分

参与人数 1技术分 +5 收起 理由
老罗 + 5 写代码试试。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-28 14:01:35
9#

回复 8 # 的帖子

比如你的00011011就不对,对应的括号((())()) 这样子不对吗?一个大括号包含两个小括号,两个小括号其中的一个又包含一个小括号。这样不对吗?

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 反驳,加分。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-28 14:20:17
10#

回复 9 # 的帖子

也对啊 不好意思   是我错了

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 哈哈

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-29 04:44:18
11#

感谢

题确实很难,很感谢大家的的帮忙
回复 使用道具 举报
黑马网友  发表于 2011-7-29 09:28:51
12#

回复 11 # 的帖子

是很难,又很麻烦的题。。。。老罗都笑话我了。。。我这个郁闷啊。。。
代码,我写不出来了,写代码的时候又想到新的东西了。。。我服了丽姐。。。

[img]http://hi.csdn.net/attachment/201107/29/6237444_1311902940fIFq.jpg[/img]
回复 使用道具 举报
黑马网友  发表于 2011-7-29 09:45:15
13#
我想提供一个算法思路是:把"()"做为一个字符串插入原来已有的字符串中,…。手机上网,无法代码…

评分

参与人数 1技术分 +1 收起 理由
admin + 1 等下记得把代码贴出来哦!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-29 10:10:15
14#

回复

别服我啊,我不会才问大家的。。。
回复 使用道具 举报
黑马网友  发表于 2011-7-29 10:15:24
15#

回复 13 # 的帖子

原有的字符串 你是怎么得出来的,()插入到原有字符串的时候,不能(。。。。。。)任意中间插入吗??  这题是我想复杂了吗???郁闷啊 一上午,头都大了。怎么想也想不明白了

有没有想过 即使得出一种 方式 但是这种方式的匹配也不值1种

看我画的图
[img]http://hi.csdn.net/attachment/201107/29/6237444_1311902940fIFq.jpg[/img]
回复 使用道具 举报
想到一个思路,个人觉得应该可行:
N对括号就有 2N个位置标签,用递归每次取出两个位置标签(小位置方0…),作为一个对象放入SET集合(原素无法重复),集合的大小就是所有排列
回复 使用道具 举报
my god!手机居然和电脑一样会自己帮人按键了!!!
现在打字更费劲了
将整个字符串作为对象,刚没说清楚.
就是太费CPU了
回复 使用道具 举报
黑马网友  发表于 2011-7-29 10:55:46
18#
:L  不好意思啊各位,代码中确实忽略了一些问题,条件2条件3都都列出来了没有在代码中添加条件3的判断以为没有必要呢,应该是条件2条件3同时满足才算匹配, 看来我也有机会去编动车的程序啵!废话少说了 在代码中添加下列条件。[code=java]//条件2条件3同时满足时候算匹配
                        for (int i = 0; i < s.length(); i++) {
                                if(s.charAt(i)=='0'){
                                        num++;
                                }else if(s.charAt(i)=='1'){
                                        num1++;
                                }
                                //根据条件3找到不成功的案例
                                if(num1>num){
                                        b=false;
                                        continue;
                                }
                        }
                        //如果没有找到不匹配的案例说明成功
                        if(b&&num==num1){
                                total++;
                                System.out.println(s);
                        }
                        nextnum+=2;////由条件6得出加权数是2
                }[/code]这段 代码替换原来
从[code=java] //因为已经有条件3推出了最大值,所有下面不需要判断是否符合条件三了[/code]到[code=java] nextnum+=2;////由条件6得出加权数是2
                }[/code]
的代码
运行结果
[code=java]4组括号匹配的数列有
00001111
00010111
00011011
00011101
00100111
00101011
00101101
00110011
00110101
01000111
01001011
01001101
01010011
01010101
4组括号共有14个匹配的括号数列[/code]

大家看还有什么遗漏的地方 提一下 把这道题完成了就不玩这种丢人的事情了 哦对了 因为int型数组只能表示32位所以n最多只能是15(1<=n<=15)
回复 使用道具 举报
黑马网友  发表于 2011-7-29 11:02:44
19#
回15楼:原有字符串最开始肯定是空,进行递规操作,对原字符串进行任意位置插入(所有位置都要遍历一次)…肯定有重复,生成结果放入set中。
回复 使用道具 举报
黑马网友  发表于 2011-7-29 11:07:53
20#
因为插入的时候是按"()"插入的,生成结果肯定符合,剩下工作就是对字符串的的所有位置进行遍历插入
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马