Google中国编程挑战赛解题管窥
编程爱好者
链接:中国编程挑战赛
由Google中国和TopCoder公司共同主办,在2005年11月21日开始报名注册,至2006年1月20日星期五结束。
详情请登录官方网站(如图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环境下能通过,但在这里却恰恰堵车,这也是面向对象编程尤其要注意的问题,因为这部分如果不注意,那最终是不能提交方案测试通过的。

提交参考源程序及解释:
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