読み込んでいます...
2009年11月16日

题目:一个好汉三个帮,三个好汉九个帮,九个好汉二十七个帮,…停,今天不是让你算n个好汉几个帮(有兴趣的网友可以自己算),我们来看这个集合

{ 1, 3, 9, 27, 81, … }

这个集合是一个递增的无限集,每个元素都是3的幂。

我们把这个集合的所有子集按照元素和从小到大的顺序排好: {}(空集), { 1 }, { 3 }, { 1, 3 }, { 9 }, { 1, 9 }, { 3, 9 }, { 1, 3, 9 }, …

现在给定一个正整数n,求第n个子集的所有元素,并按从大到小的顺序排列好

例:

n的值    结果
1        { }
4        { 3, 1 }
6        { 9, 1 }
500      { 6561, 2187, 729, 243, 81, 3, 1 }

题目:给出一个包含各种括号的表达式,判断括号是否配对。括号配对的条件:括号必须先左后右,并且左右括号数量相等;对于多重括号,从外到内嵌套顺序为:{} -> [] -> () -> <>。例如{[(<>)]}。

接口: bool match(char* str);   合法返回true, 否则返回false。

输入范例:
{[(<>)]}
{}
<(>)
<()>

返回:
true
true
false
false

来自编程爱好者编程比赛题。

Answer1
Answer2

以上代码纯属参考,欢迎讨论。

  1. lfdeng @

    第二题的答案是错误的
    如果是MainTest("(<]")呢

  2. 诡异的西红柿 @

    [b]@lfdeng[/b]
    数字这东西随便了,我只要变成不规则的就行了,只要让你加在一起不为0就行了。。整体思路还是那样。。
    //给相应的值匹配正负对,以便相加后抵消
    switch (c)
    {
    case ‘{‘: return -41;
    case ‘[': return -32;
    case '(': return -23;
    case '<': return -14;
    case '>': return 14;
    case ')': return 23;
    case ']‘: return 32;
    case ‘}’: return 41;
    default: return 0;
    }

  3. lfdeng @

    这是错误的想法
    假设’(‘、’<’和’]'分别是a、b和c
    a*x+b*y=c*z
    解出任意一组xyz,(一定有解)
    x个’(‘,y个’<’和z个’]’
    你的程序同样会给一个true
    (2个符号和4个的同样适用)

  4. 诡异的西红柿 @

    [b]@lfdeng[/b]
    嗯,我同意你的观点,我加个计数的就行了。

  5. 匿名懦夫 @

    第二题有点词法分析的意思。用双栈很正常,因为编译原理课本上就是这么教的。

:-D :-? 8) :cry: 8-O :lol: :-x :-| :?: :-P :oops: :roll: :( :) :-o :wink: more »