Google中国编程挑战赛解题管窥

编程爱好者

链接:中国编程挑战赛

由Google中国和TopCoder公司共同主办,在2005年11月21日开始报名注册,至2006年1月20日星期五结束。

详情请登录官方网站(如图1所示):

1-f16-01.jpg
图1

http://www.topcoder.com/pl/?module=Static&d1=gccj05&d2=ZH_rules

题目

要想取胜,必须先研究其题型,笔者在竞技场做过三道题,只有一道提交成功,比赛用的语言就四种:Java、C++、C#和VB,准确地说,VB应该是VB.net,从其应用上,都是对面向对象技术和简单算法的考查。所以问题相对来说并不难,问题包括三部分,第一部分是问题详细说明,第二部分是所用部件说明,第三部分是示例。因为全是英文,对英文不太好的朋友,需要一定的时间阅读,还好后面是有示例的,通过将说明和示例一同对比来看,不失为一种理解题目的好办法。

1.问题详细说明

这一部分是解题的关键,但看着英文原题,感觉太烦琐,这个问题简单说就是:在一行文字中,光标移动可通过四个键完成,左移和右移键,Home键和End键,将四键用L、R、H和E四个字母分别表示,现在一行上写上若干个上述字母的组合及本行共有多少文字,问光标在什么位置,最后求的是表示位置的数值。

2.部件说明

这一部分是我们尤其要重点看的,因为题目考查的是一个特定小问题,并且是在一个模拟环境中实现,我们需要通过后面所用的部件格式来完成,其大小写也要注意,有时通过不了测试的原因可能就在这里。

Definition

Class: CursorPosition

Method: getPosition

Parameters: String, Integer

Returns: Integer

Method signature:

Public Function getPosition(keystrokes As String, N As Integer) As Integer

(be sure your method is public)

Constraints

-keystrokes will be contain between 1 and 50 'L', 'R', 'H', and 'E' characters,

inclusive.

N will be between 1 and 100, inclusive.

3.示例

示例总计四个,这里只列出第一个。通过示例能更好地帮助我们理解题目。

Examples

0)"ERLLL"

10

Returns: 7

First, we go to the end of the line at position 10. Then, the right-arrow does nothing because we are already at the end of the line. Finally, three left-arrows

brings us to position 7.

解题及体会

在解上述题目的时候,觉得还不如某些奥林匹克赛的题目难度大,但奥赛题倾向于独立成题,而此赛的题目虽然也是相对独立的题目,但不可忘记它存在的编辑编译环境问题(如图2所示),此环境和我们日常所用的编辑编译的语言环境十分不同,可能在自己的VB.net环境下能通过,但在这里却恰恰堵车,这也是面向对象编程尤其要注意的问题,因为这部分如果不注意,那最终是不能提交方案测试通过的。

1-f16-02.jpg
图2

提交参考源程序及解释:

Public Class CursorPosition

public Function getPosition(keystrokes As String, N As Integer) As Integer

dim i as integer

dim strNum as integer '记录一行字母个数

dim SinStr as string

dim ReturnNum as integer

ReturnNum=0

strNum=keystrokes.length

for i=1 to strNum '从第一个开始取到最后一个字母

sinstr=keystrokes.substring(i,1)

if sinstr="E" then ReturnNum=N 'End键表示移到行尾

if sinstr="H" then ReturnNum=0 'H键表示移到行头

if sinstr="L" then ReturnNum=ReturnNum-1'L表左移一个字符

if sinstr="R" then ReturnNum=ReturnNum+1'R表右移一个字符

if ReturnNum<0 then ReturnNum=0 '解决移到左边头但还左移

if ReturnNum>N then ReturnNum=N '解决移到右边尾还右移

next i

return ReturnNum

End Function

End Class