软件设计师考试……

抱着凑热闹的心态报名软件设计师考试了,可硬是没想到题目比我想象中的简单那么多,甚至让我有了我七成的把握通过——嗯,不过问题是,我竟然没有注意到最后三题是选做一题的,结果全给做了。

嗯,现在说重点,我发现最后一题有问题 ! (有问题又怎样?发现了又怎样?做对了又怎样?做错了又能怎样?)

题目是这样的:给定一个序列,确定它能不能由序列 1, 2, 3, 4, … n 经过一个栈之后生成

例如,序列 3, 2, 1 可以由序列 1, 2, 3 生成:

image

再比如, 1, 3, 2 也可以由序列 1, 2, 3 生成:

image

好吧,然后,题目就给出了一个示例程序要求补齐:(细节记不清了,但关键的地方还是记得很清楚的)

image

其中第一个空要求初始化堆栈(原本是C语言的,我这里懒得麻烦),这个简单到可以忽略。

第二个空也没有难度,忽略。

第三个空是无解的判断条件,很简单,自己意会去。

第五个空也很简单……

问题出在第四个空!第四个!

要求填入 “begin=” 后面的部分,可是,仅仅让它等于 maxNo-1 显然是不行的——考虑 4 3 2 7 6 9 8 5 1 这样一组数据就知道了。

 

于是我只好写成上面那种非常 tricky 的形式了……

而且除此之外我没有好的主意能够填入第四个空——难道,亲爱的出题者,你就是想要 ((j=maxNo-1),(maxNo=state[i]+1),j) 这个答案吗?

或者,你们的本意是没有内个 for 循环,就像注释的内样?——那倒也可以。

 

PS. 经测试,比较靠谱——虽然遇到重复的数据,比如 1, 3, 2, 4, 6 , 5, 6 这样,会死循环——但要避免这种情况,在它给的 5 个空之中、不加入分号的情况下,我是没有办法的。

PPS. 我身陷宁波;其他地方的小盆友,你们也遇到这道神奇的题目了吗?

PPPS. 代码,拿去玩吧,公有领域(Public Domain):

#include <iostream>
#include <stack>
using namespace std;

bool f (int n, int* state) {
    stack station;                                  /// Question 1
    int i,j,begin,maxNo=1;
    for(i=0;i
        if(!station.empty()) {                           /// Question 2
            if (station.top()==state[i]) {
                cout<<<" ";
                station.pop();
                ++i;
            } else if (state[i]
                return false;
            } else {
                begin=((j=maxNo-1),(maxNo=state[i]+1),j);/// Question 4: begin=?
                for(j=begin+1;j<=state[i];++j) {
                    station.push(j);
                }
                //begin=maxNo++-1;
                //station.push(begin+1);
            }
        } else {
            begin=maxNo;
            for(j=begin;j<=state[i];++j) {
                station.push(j);
            }
            maxNo=j;                                     /// Question 5
        }
    }
    return true;
}

int main() {
    int n, *state;
    cout<<"How many? "; cin>>n;
    state=new int[n];
    for(int i=0;i
        cin >> state[i];
    cout<<<
    delete[] state;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值