题目分析

  1. 题目给出我们一个长的字符串
  2. 这个字符串通过分号隔开了对一个坐标(0,0)的操作执行
  3. 我们需要提取出来所有合法的坐标,并对目标进行运动
  4. 输出最终这个目标在移动后的位置信息
  • 思路其实很简单,遍历整个字符串信息是一定的,难点就是在如何整理出来合法坐标上

方法一:子字符串截取判断

  • 实现思路

    • 我们通过检查两项内容判断这个坐标是否合法
    • 第一项检查是字母是否为"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))				# 输出最终的坐标结果

复杂度分析

  • 时间复杂度:O(n)O(n),对整个字符串遍历一遍的时间代价
  • 空间复杂度:O(1)O(1),只有常量级别的空间开销如变量等

方法二:try except语句

  • 实现思路
    • python中有try-except语句来处理异常情况
    • 我们只需要强行将符合要求的方向判断出来,并将坐标信息其余部分强制转换成整数
    • 如果合法则会对坐标进行操作
    • 如果非法则会执行异常处理工作直接跳过此次循环

alt

              
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))

复杂度分析

  • 时间复杂度:O(n)O(n),对整个字符串遍历一遍的时间代价
  • 空间复杂度:O(1)O(1),只有常量级别的空间开销如变量等