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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

回复 20 # 的帖子

有代码更有说服力,你这样不贴代码即使说得口水干了,对我这种IQ不高的人来说就是念天书,还是不知道什么搞
回复 使用道具 举报
代码看起来更费劲吧,全是襄套的循环…
回复 使用道具 举报
黑马网友  发表于 2011-7-29 12:36:49
23#
public class Test{
        /*
         * sum 共有sum中排序
         * M,N左右括号的个数
         */
        private static int sum = 0;
        private static final int M = 4;
        private static final int N = 4;
        public static void main(String[] args) {
                fun(M,N);
                System.out.println(sum);
        }
        /*
         * 判断这种排序是否成功
         * m,n 表示还剩余的左右括号的个数
         * 如果剩余的左括号比右括号多,说明先前的右括号比左括号多,那么这种排序就错误
         * 如果左右括号没了,那么这种排序正确,sum 加1
         */
        private static boolean isRight(int m,int n) {
                if(m-n>0){
                        return false;
                }else if(m==0 ||n == 0){
                        sum += 1;
                        return false;
                }
                return true;
        }
        private static boolean fun(int m, int n) {
                InsertLeft(m-1,n);
                InsertRight(m,n-1);
                return true;
        }
        //插入左括号
        private static void InsertLeft(int m,int n) {
                if(isRight(m,n)){
                        fun(m,n);
                }
        }
        //插入右括号
        private static void InsertRight(int m,int n) {
                if(isRight(m,n)){
                        fun(m,n);
                }
        }
}
//14种排序方法

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
用java久了,都把二叉树给忘了,用二叉树貌似比较简单吧,code去
回复 使用道具 举报
黑马网友  发表于 2011-7-29 12:59:32
25#

回复 板凳 的帖子

要不你算一下3000对括号有多少种?
18对括号有477,638,700种,19对括号有1,767,263,190种
回复 使用道具 举报
黑马网友  发表于 2011-7-29 13:18:51
26#
回复21楼:我都声明了…没有网,手机上的
回复 使用道具 举报
黑马网友  发表于 2011-7-29 13:38:21
27#

回复 23 # 的帖子

牛逼 赞一个
回复 使用道具 举报
黑马网友  发表于 2011-7-29 21:30:44
28#
忒幸亏了,终于弄出来了。
使用递归实现思路:
1.        都以最后一个括号为目标,用他的左括号在其他括号中间移动(关键的思想)
如()()()()可以在移成这样:
()()(())
()(()())
(()()())
2.        由上面分析出要处理的有两部分别是:
第一部分:()()(())....
第二部分:()(()())、(()()()).....
3.        最后就是每完成一次减1,直到只有一个括号为止。
下面看代码:[code=java]package com.itcast.test;

public class Recursion {

        public static void main(String[] args) {
                System.out.println(select(4));
        }
        /*
         * sum=1表示并排的括号如:();()();()()()
         */
        public static int sum = 1;
        public static int select(int num) {
                if (num == 1) {
                        return sum;
                }
                // 括号的个数-1
                /*
                 * 假如num初始为4
                 * ()()(())
                 * ()(()())
                 * (()()())
                 * 得到3个
                 */
                sum += --num;
                /*
                 * 假如num初始为4
                 * ()()|(())
                 * (())|(())
                 * 处理|左边的
                 * 得到1个
                 */
                for (int i = num - 1; i > 1; i--) {
                        select(num - 1);
                }
                /*
                 * 假如num初始为4
                 * ()(()())
                 * ()((()))
                 * 处理括号里面的
                 */
                for (int i = num; i > 1; i--) {
                        select(i);
                }
                // 每次减一个括号 的递归调用
                return select(num);
        }
}[/code]代码简单,但是真的想得头都炸了,还望版主多多多多的支持啊:lol

评分

参与人数 1技术分 +2 收起 理由
admin + 2 辛苦了!

查看全部评分

回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马