有一个打字员,他打字的时候有个习惯,从来不用 Shift 来切换大小写,只用 Caps Lock。 现在给他一个地铁站的名字,你需要写一个程序来告诉他,他需要敲击多少下键盘才能打出 这个地铁站名。
入
第一行输入一个数字 n (n<1000),表示共有多少个需要处理的车站名。从第 2 到第 n+1 行是这 n 个车站名。车站名由英文字母构成,名字的长度不会超过 100 个字符。已知开始时 键盘是输入小写字母的状态。
输出
这个打字员敲击键盘的次数。
样例输入
5
BeiJingDaXueDongMen
AAAaaaBBBbbbABAB
AmericanRAILWAY
AaAaAa
DFjfkdaB
样例输出
31
21
18
12
11
谁能帮助我一下,这个算法?谢谢了c语言c#c++
入
第一行输入一个数字 n (n<1000),表示共有多少个需要处理的车站名。从第 2 到第 n+1 行是这 n 个车站名。车站名由英文字母构成,名字的长度不会超过 100 个字符。已知开始时 键盘是输入小写字母的状态。
输出
这个打字员敲击键盘的次数。
样例输入
5
BeiJingDaXueDongMen
AAAaaaBBBbbbABAB
AmericanRAILWAY
AaAaAa
DFjfkdaB
样例输出
31
21
18
12
11
谁能帮助我一下,这个算法?谢谢了c语言c#c++
然后从左到右读字符串,一个flag标记当前大小写状态
如果状态一致,每打一个字母,按键一次,如果状态不一致,按键次数加1(按caps lock)
统计完了就是次数.
python测试
cases = ['abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ']
def hit_key(s,i=0):
if len(s)==0:
return 0
elif len(s)==1:
return 1+(s[0] not in cases[i] and 1 or 0)
else:
if s[0] in cases[i]:
return 1+hit_key(s[1:],i)
else:
return 2+hit_key(s[1:],1-i)def main():
s = ['BeiJingDaXueDongMen','AAAaaaBBBbbbABAB','AmericanRAILWAY','AaAaAa','DFjfkdaB']
d = {x:hit_key(x,0) for x in s}
for k in s:
print d[k],k
结果:
main()
31 BeiJingDaXueDongMen
21 AAAaaaBBBbbbABAB
18 AmericanRAILWAY
12 AaAaAa
11 DFjfkdaB
BeiJingDaXueDongMen //源数据
1001000101001000100 //大小写状态
0101100111101100110 //下一行算法得到的结果,为了便于你观察才提前一点
将这个状态进行如下算法:将当前值与上一值进行相减并取绝对值,即可得到上一行数据
将这个值相加,则是变化的数量。再加上字节长度,就是击键数
还要考虑一下初始状态,如:必须是从CAP关闭状态开始的话,则可能第1位要计算成1。 还有最后一位,是否必须将CAP设置为开或关,或者不管它