-->
当前位置:首页 > 题库 > 正文内容

编程题:h0122. 对称顺序

Luz3年前 (2022-02-19)题库698
您在由一群小丑经营的Albatross Circus Management工作,您刚写了一个以长度非递减的顺序输出姓名列表的程序(每个姓名至少要和前面的名字一样长)。但是,您的老板不喜欢这样的输出方式,他要求改为看上去对称的输出形式,最短的字符串在顶部和低部,最长的在中间。他的规则是每一对姓名在列表对等的地方,每一对姓名中的第一个在列表的上方。如在样例输入的第一个例子中,Bo和Pat是第一对,Jean和Kevin是第二对,等等。

### 输入格式:
输入包含若干测试用例。每个测试用例是一个或多个字符串组成的集合。输入以0为结束。每个测试用例以一个整数n为开始,表示该测试用例中字符串的个数,每个字符串一行,字符串以长度的非递减顺序排列。字符串不含空格。每个测试用例中的字符串至少有一个,至多有15个。每个字符串至多25个字符。

### 输出格式:

对每个测试用例输出一行“SET n”,其中n从1开始,后面的输出如样例输出所示。

### 输入样例:

in
7
Bo
Pat
Jean
Kevin
Claude
William
Marybeth
6
Jim
Ben
Zoe
Joey
Frederick
Annabelle
5
John
Bill
Fran
Stan
Cece
0


### 输出样例:

out
SET 1
Bo
Jean
Claude
Marybeth
William
Kevin
Pat
SET 2
Jim
Zoe
Frederick
Annabelle
Joey
Ben
SET 3
John
Fran
Cece
Stan
Bill







答案:若无答案欢迎评论

设以长度为非递减的顺序的姓名列表为s[1]…s[n]。
要求输出的格式是对称的,最短的字符串在顶部和低部,最长的在中间;也就是说,在输出的上半区,姓名的长度是递增的;而在输出的下半区,姓名的长度是递减的。
本题有两种解法:非递归的方法和递归的方法。
非递归的方法
输入的字符串集合中的字符串以长度为非递减顺序排列。输出是对称的,最短的字符串在顶部和低部,最长的在中间,所以,上半区的输出如下:
s[1]
s[3]
s[5]
……
s[n],如果n是奇数;或s[n-1],如果n是偶数。
也就是说,循环语句 “for ( int i=1; i<=n; i+=2) cout<<s[i]<<endl;”实现上半区的输出。
下半区的输出如下:
s[n-(n%2)]
s[n-(n%2)-2]
s[n-(n%2)-4]
……
s[2]
也就是说,循环语句“for ( int i= n-(n%2); i>1; i-=2) cout<<s[i]<<endl;”实现下半区的输出。

递归方法

![图片51.png](~/44491789-5d52-46b6-b8c5-92262c2e62d1.png)

计算过程:
直接输入,并输出当前组的第一个字符串s[2*k-1];S[ ]的长度n--;
如果n>0,则输入当前组的第二个字符串s[2*k],S[ ]的长度n--。若存在下一组(n>0),则通过递归调用print(n),将s[2*k]压栈,继续处理下一组…,这个过程进行至n==0为止。然后回溯,按先进后出顺序依次处理栈中的字符串。显然,若n是偶数,则s[n-1]s[n-3]…s[2]出栈并输出;若n是奇数,则s[n]s[n-2]…s[2]出栈并输出。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。