题意整理。

  • 开发一个坐标计算工具,按输入的字符串进行对应的坐标移动。
  • 合法的输入字符串为:A(或者D或者W或者S)+数字(两位以内)。若输入不合法,直接丢弃。

方法一(模拟)

1.解题思路

  • 首先通过分号将输入的字符串分割成字符串数组。
  • 然后处理字符串数组的每一个字符串,如果长度不是2或3,表示不合法,直接跳过。
  • 接着计算偏移量,遍历每个字符串除第一个字符外的所有字符,通过公式计算到偏移量。如果某个字符不在'0'-'9'范围内,将偏移量置为0,终止循环。
  • 最后根据计算得到的偏移量,将坐标移动到对应的位置。

图解展示: alt

2.代码实现

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        //标准输入
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            //输入的一行字符串
            String s=sc.nextLine();
            //通过";"分割成字符串数组
            String[] strarr=s.split(";");
            //横坐标
            int X=0;
            //纵坐标
            int Y=0;
            for(int i=0;i<strarr.length;i++){
                String str=strarr[i];
                int len=str.length();
                //如果长度不是2或者3,表示不合法,直接跳过
                if(len<=1||len>3){
                    continue;
                }
                //记录偏移量
                int move=0;  
                for(int j=1;j<len;j++){
                    //计算偏移量
                    if(str.charAt(j)>='0'&&str.charAt(j)<='9'){
                        move=move*10+str.charAt(j)-'0';
                    }
                    //如果不是字符'0'-'9',表示输入不合法
                    else{
                        move=0;
                        break;
                    }
                }
                //记录坐标移动方向
                char c=str.charAt(0);               
                if(c=='A'){
                    //向左移动move个单位
                    X-=move;
                }
                else if(c=='S'){
                    //向下移动move个单位
                    Y-=move;
                }
                else if(c=='D'){
                    //向右移动move个单位
                    X+=move;
                }
                else if(c=='W'){
                    //向上移动move个单位
                    Y+=move;
                }
                
                
            }
            System.out.println(X+","+Y);
        }
        
    }
}

3.复杂度分析

  • 时间复杂度:假设输入的字符串长度为n,最坏情况下,除了一个长度为1的字符串,所有字符串都为空,分割之后的字符串总共有n-1个,所以时间复杂度为O(n)O(n)
  • 空间复杂度:最坏情况下,需要额外大小为n1n-1的字符串数组,所以空间复杂度为O(n)O(n)

方法二(try、catch处理异常)

1.解题思路

思路和方法一基本一致,只是在处理偏移量的时候,通过try、catch来捕获异常,一旦发现输入不合法,直接跳过即可。

2.代码实现

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        //标准输入
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            //输入的一行字符串
            String s=sc.nextLine();
            //通过分号进行分割
            String[] strarr=s.split(";");
            //横坐标和纵坐标
            int X=0;
            int Y=0;
            for(int i=0;i<strarr.length;i++){
                String str=strarr[i];
                int len=str.length();
                //如果长度不合法,直接跳过
                if(len<=1||len>3){
                    continue;
                }
                //通过try、catch捕获异常
                try{
                    char c=str.charAt(0);    
                    //记录偏移量
                    int move=Integer.parseInt(str.substring(1,len));           
                    if(c=='A'){
                        //向左移动move个单位
                        X-=move;
                    }
                    else if(c=='S'){
                        //向下移动move个单位
                        Y-=move;
                    }
                    else if(c=='D'){
                        //向右移动move个单位
                        X+=move;
                    }
                    else if(c=='W'){
                        //向上移动move个单位
                        Y+=move;
                    }
                }
                catch(Exception e){
                    continue;
                }
            }
            System.out.println(X+","+Y);
        }
        
    }
}

3.复杂度分析

  • 时间复杂度:假设输入的字符串长度为n,最坏情况下,除了一个长度为1的字符串,所有字符串都为空,分割之后的字符串总共有n-1个,所以时间复杂度为O(n)O(n)
  • 空间复杂度:最坏情况下,需要额外大小为n1n-1的字符串数组,所以空间复杂度为O(n)O(n)