题解 | #坐标移动#
坐标移动
http://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29
题目分析
- 题目给出我们一个长的字符串
- 这个字符串通过分号隔开了对一个坐标(0,0)的操作执行
- 我们需要提取出来所有合法的坐标,并对目标进行运动
- 输出最终这个目标在移动后的位置信息
- 思路其实很简单,遍历整个字符串信息是一定的,难点就是在如何整理出来合法坐标上
方法一:子字符串截取判断
-
实现思路
- 我们通过检查两项内容判断这个坐标是否合法
- 第一项检查是字母是否为"W,A,S,D"中的一个
- 第二项检查是在第一个字母出现后,坐标字符串的除第一位之外,其他的部分是否是一个合法数字即可
-
根据检查提炼出来的结果进行坐标移动,返回最终坐标信息即可
import sys
def valid(s):
check1 = False
check2 = True
if not s: # 判断是否为空
return check1
if s[0] in ["A","S","D","W"]: # 判断方向信息是否合法
check1 = True
for i in range(1, len(s)): # 判断剩余位是否为数字
if ord(s[i]) < ord('0') or ord(s[i]) > ord('9'):
check2 = False
return check1 and check2
for line in sys.stdin:
ops = line.split(';')
x = y = 0
for op in ops:
if not valid(op): # 只有在合法情况下才可以对坐标x,y进行操作
continue
elif op[0] == 'A':
x -= int(op[1:])
elif op[0] == 'D':
x += int(op[1:])
elif op[0] == 'W':
y += int(op[1:])
elif op[0] == 'S':
y -= int(op[1:])
print("%d,%d"%(x,y)) # 输出最终的坐标结果
复杂度分析
- 时间复杂度:,对整个字符串遍历一遍的时间代价
- 空间复杂度:,只有常量级别的空间开销如变量等
方法二:try except语句
- 实现思路
- python中有try-except语句来处理异常情况
- 我们只需要强行将符合要求的方向判断出来,并将坐标信息其余部分强制转换成整数
- 如果合法则会对坐标进行操作
- 如果非法则会执行异常处理工作直接跳过此次循环
s = input().split(';')
x = y = 0
for i in s:
if not i: continue
try:
if i[0] == 'A':
x -=int(i[1:])
if i[0] == 'D':
x +=int(i[1:])
if i[0] == 'S':
y -=int(i[1:])
if i[0] == 'W':
y +=int(i[1:])
except:
continue
print('%d,%d'%(x,y))
复杂度分析
- 时间复杂度:,对整个字符串遍历一遍的时间代价
- 空间复杂度:,只有常量级别的空间开销如变量等