【编程题目】四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())

46.搜狐(运算):
四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())

跟12个人排高矮的题目差不多。 用 0 表示 “(”,用 1 表示“)” 则需要数字二进制最低8位有 4个1和 4个0,且从低位到高位对1 和 0 计数时,0 出现的次数不能超过 1 出现的次数。

/*
46.搜狐(运算):
四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())
*/

#include <stdio.h>

int c_bits(int n)
{
    int result = 0;
    for(; n; n &= n-1, result++);
    return result;
}

int main()
{
    int i;
    int ways = 0;
    //0代表"(" 1代表 ")" 0必须在1前面
    for (i = 0; i < (1<<7); i++)
    {
        if (c_bits(i) == 4)
        {
            int one_n = 0;
            int zero_n = 0;
            for (int j = 0; j < 8; j++)
            {
                if (((i >> j) & 1) == 0)
                {
                    zero_n += 1;
                }
                else
                {
                    one_n += 1;
                }
                if (zero_n > one_n)
                {
                    break;
                }
            }

            if (one_n == 4 && zero_n == 4)
            {
                ways++;
                printf("way %d:", ways);
                for (int j = 7; j >= 0; j--)
                {
                    if (((i >> j) & 1) == 0)
                    {
                        printf("( ");
                    }
                    else
                    {
                        printf(") ");
                    }
                }
                printf("\n");
            }
        }
    }

    return 0;
}

网上有一种方法与我的差不多,区别在判断是否符合要求时 :

http://www.cnblogs.com/GoAhead/archive/2012/05/30/2525824.html

把所有8位以内的二进制数循环一次,对于每一个二进制数的每一位,从高到低依次相加,其中遇到0的话加-1,遇到1加1,每次加的结果需要大于等于0

加完所有位的结果应该为0,满足两个条件的即是一种组合

我用的方法的缺点是括号数变化后,需要改数字。

里面还提到了树的方法:

我们可以用生成二叉树的方法解决,重新定义一个数据结构,数据结构如下:

struct Node{

int data;//0或1

int num0;//0出现的次数

int num1;//1出现的次数

struct Node* lchild;

struct Node* rchild;

};

同时我们需要用一个队列保存叶子节点的指针,目的是为了降低时间复杂度

步骤如下:

(1)用元素1生成根节点,同时num1++,num0=0,lchild=NULL,rchld=null;把该节点入队列

(2)从队列取队首元素,比较num1和num0的大小,当num1=4的时候节点不再增加;如果num1大于num0,则为该节点生成生成左右孩子,左孩子data=1,num0=父节点num0;num1=父节点num1+1;右孩子data=0,num0=父节点num0+1,num1=父节点num1;

如何num1=num0,只增加一个左孩子1,同时新增加的节点入队列

(3)重复步骤(2)知道队列为空

(4)统计叶子节点的个数即是结果

我没仔细看,因为没给代码。

http://blog.csdn.net/lihappy999/article/details/7395943 中有通用的方法 用递归实现 完全搜索后判定 验证通过

#include<iostream>
#include<cassert>
#include <vector>
using namespace std ;
void Print(vector<char> v)
{
    for (vector<char>::iterator beg=v.begin();beg!=v.end();++beg)
        cout<<*beg<<" ";
    cout<<endl;
}
void MatchNums(int nSize,int nLen,vector<char> &v)
{
    int nLeftBrackets=0;
    int nRightBrackets=0;
    for (vector<char>::iterator beg=v.begin();beg!=v.end();++beg)
    {
        if(*beg==‘(‘)
            nLeftBrackets++;
        else
            nRightBrackets++;
        if(nRightBrackets>nLeftBrackets)
            return;
        if(nLeftBrackets+nRightBrackets==nSize&&nLeftBrackets==nRightBrackets)
            Print(v);
    }

    if (nLen>0)
    {
        v.push_back(‘(‘);
        MatchNums(nSize,nLen-1,v);
        v.pop_back();
        v.push_back(‘)‘);
        MatchNums(nSize,nLen-1,v);
        v.pop_back();
    }
}
int main()
{
    vector <char> v;
    int n=6;
    MatchNums(n,n,v);
    return 1;
}

【编程题目】四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())

时间: 2024-10-03 22:32:22

【编程题目】四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())的相关文章

【目录】编程题目

编程题目 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1) 一个数组是由一个递减数列左移若干位形成的,在这种数组中查找某一个数.☆ 请修改 append 函数,利用这个函数实现两个非降序链表的并集 一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),取出其中一段,要求包含所有 N 中颜色,并使长度最短. 求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边, 有向图不再连通 有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前

【编程题目】对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一

45.雅虎(运算.矩阵):1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到. 这道题,是我目前为止做过的最最最最最麻烦.最繁琐的题目了. 思路: 把输入的矩阵一步步还原成 0 矩阵 一个数字,只可能伴随着它上下左右四个方向的数字变化. ①如果数字比它周围四个数的和要大,那么一定不满足条件. ②如果数字小于等于四周的数字和,且其四周仅有一个数字不为0: 不为0的那个周围数字的大小 -=

OJ——华为编程题目:输入字符串括号是否匹配

package t0815; /* * 华为编程题目:输入字符串括号是否匹配 * 若都匹配输出为0,否则为1 * 样例输入:Terminal user [name | number (1)] * 样例输出:0 * Java版本 */ /* * 个人总结: * (1)语法上Java的输入Scanner使用 * (2)char[] arr=mxf.toCharArray()的使用,将输入的字符串转成字符数组:这样就可以一个 * 一个的遍历 * (3)算法上,这里使用了经典的入栈和出栈的思想 * */

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

【编程题目】12 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,

80.阿里巴巴一道笔试题(运算.算法)问题描述:12 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 我的思路:输入从小到大排列的数字  把数字4个分为一组 如下: min **** B A    **** max 其中第一个数字一定是当前最小的, 最后一个数字一定是当前最大的. 其次,设位置A .B,这样去掉这四个数字, 问题又变成了规模小一些的同样的问题. 关键是A和B的确定,有很多种可能,我们依次尝试,如果不满足问题的条件了,就退出来

另类编辑距离-c#求解-英雄会在线编程题目

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢? 一. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性. var C

【编程题目】字符串的排列(字符串)★

53.字符串的排列(字符串).题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串 abc,则输出由字符 a.b.c 所能排列出来的所有字符串abc.acb.bac.bca.cab 和 cba. 这道题花了我一天,要好好总结! 思路:这道题目感觉有些难,主要是字符串中的字符可能会有重复.我的想法是把一共有多少种字符和每种字符出现的次数统计出来,每个位置对这些字符变量,下一个位置的可用字符减小,再遍历. /* 53.字符串的排列(字符串). 题目:输入一个字符串,打印出该字符串中字

【编程题目】n 个骰子的点数

67.俩个闲玩娱乐(运算).2.n 个骰子的点数.把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S.输入 n,打印出 S 的所有可能的值出现的概率. 思路:用递归把每个骰子的可能情况变量,记录各种和S出现的次数 比上 总情况数就是概率 /* 67.俩个闲玩娱乐(运算). 2.n 个骰子的点数. 把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S.输入 n, 打印出 S 的所有可能的值出现的概率. */ #include <stdio.h> #include <stdlib.

【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)

32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[100,99,98,1,2,3];var b=[1,2,3,4,5,40]; 首先,目标一定是先找到n个数字,使得数字和比总和的一半小,但是最接近. 思路一:开始看这道题跟之前学的动态规划很像,就想用动态规划来解.但是....做不出来........... 必须要选一半的数字让我头都大了. 思路二: