一、题目描述
描述
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
输入:
合法坐标为A(或者D或者W或者S) + 数字(两位以内)
坐标之间以;分隔。
非法坐标点需要进行丢弃。如AA10; A1A; ; YAD; 等。
下面是一个简单的例子 如:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
处理过程:
起点(0,0)
A10 = (-10,0)
S20 = (-10,-20)
W10 = (-10,-10)
D30 = (20,-10)
x = 无效
A1A = 无效
B10A11 = 无效
一个空 不影响
A10 = (10,-10)
结果 (10, -10)
注意请处理多组输入输出
输入描述:
一行字符串
输出描述:
最终坐标,以逗号分隔
二、题解
本题难点有两处,一是理解坐标系,二是排除干扰项;
1、理解坐标系
首先建立一个坐标系,分别由x轴,y轴;
A是向左,即A10 为 x - 10;
W是向上,即W20 为 y + 20;
S是向下,即S10 为 y - 10;
D是向右,即D20 为 x + 20;
2、排除干扰项
根据题目,可使用以下排除法排除干扰项:
每项有2-3个字符;
第0个字符必须为大写的AWSD其中的一个;
后面的字符必须是数字;(使用Character.isDigit() 或 ascii码 或 正则来判断)
三、java实现
import java.util.Scanner; /** * @author zhangnianlei * @description * @date 2021/8/2 */ public class Main { private final static String DIR_ABCD = "AWDS"; public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { String[] s = sc.nextLine().split(";"); System.out.println(dealPosition(s)); } } private static String dealPosition(String[] s) { int x = 0, y = 0; for (String each : s) { // 根据字符串(A10)构建一个指令对象,为空代表无效指令 MoveOrder order = new MoveOrder().getMoveOrderByStr(each); if (null == order) continue; if ("A".equals(order.direction)) { x -= order.distance; } else if ("D".equals(order.direction)) { x += order.distance; } else if ("W".equals(order.direction)) { y += order.distance; } else { y -= order.distance; } } return x + "," + y; } /** * @description 内部类:指令对象 * @author zhangnianlei * @date 2021/8/2 * @throws * @modifier */ public static class MoveOrder { /** * 移动方向 */ String direction; /** * 移动距离 */ Integer distance; public MoveOrder() { } public MoveOrder(String direction, Integer distance) { this.direction = direction; this.distance = distance; } /** * @description 根据字符串(A10)构建一个指令对象,返回为null代表无效指令 * @author zhangnianlei * @date 2021/8/2 * @throws * @param: str * @return: MoveOrder * @modifier */ public MoveOrder getMoveOrderByStr(String str) { if (null == str || str.length() == 0) return null; if (str.length() > 3) return null; String dir = String.valueOf(str.charAt(0)); if (DIR_ABCD.indexOf(dir) <= -1) return null; for (int i = 1; i < str.length(); i++) { if (!Character.isDigit(str.charAt(i))) { return null; } } String num = str.substring(1, str.length()); MoveOrder order = new MoveOrder(dir, Integer.valueOf(num)); return order; } } }