问题描述:
1. 问题涉及知识点.
- 字符串处理.
2. 自己解法.
- 按照行拿到字符串,对字符串使用
string.split(";")
进行分割.对每个单元进行合理性分析. - 若合理按照题目要求,执行.
package com.chaoxiong.niuke.huawei;
import java.util.Objects;
import java.util.Scanner;
public class HuaWei_17 {
private static final String Split = ";";
public static void main(String[] args) {
String string = null;
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
string = in.nextLine();
int []pointArr = {0,0};
String[] strArray = string.split(Split);
for (String each:strArray){
int []flag = isLegel(each);//[(1表示合法 -1表示不合法),(其他表示移动的多少 -1表示不合法)]
if(flag[0]==1&&flag[1]!=-1){
//输入合法
char []charArr = each.toCharArray();
char dir = charArr[0];
int step = flag[1];
nextPoint(pointArr,dir,step);
}
}
System.out.println(pointArr[0]+","+pointArr[1]);
}
}
private static void nextPoint(int[] pointArr, char dir, int step) {
switch (dir){
case 'A'://向左
pointArr[0] = pointArr[0]-step;
break;
case 'D'://向左
pointArr[0] = pointArr[0]+step;
break;
case 'W'://向左
pointArr[1] = pointArr[1]+step;
break;
case 'S'://向左
pointArr[1] = pointArr[1]-step;
break;
}
// System.out.println(pointArr[0]+" "+pointArr[1]);
}
private static int[] isLegel(String each) {
// AA10; A1A; $%$; YAD; 则为不合法.
//1. 第一位必须是 A,D,W,S中的一个
//2. 之后的必须是数字.
int []falg = {-1,-1};
if(Objects.equals(each.trim(), "") || each.length() < 2){
//不合法
falg[0]=-1;
}else {
char[] charArr = each.toCharArray();
//判断第一位
if(inCharSet(charArr[0])){
falg[0]=0;
falg[1]=canConvetInt(new String(charArr, 1, charArr.length - 1));
}else {
//不合法
falg[0]=-1;
}
}
return falg;
}
private static int canConvetInt(String s) {
// 可以装换成整数返回true 不行返回false.
int result = -1;
try {
result = Integer.parseInt(s);
return result;
}catch (Exception e){
return result;
}
}
private static boolean inCharSet(char c) {
return c == 'A' || c == 'D' || c == 'W' || c == 'S';
}
}
3. 优质答案.
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner scan=new Scanner(System.in);
while(scan.hasNextLine()){
int x=0;
int y=0;
String[]tokens=scan.nextLine().split(";");
for(int i=0;i<tokens.length;i++){
try{
int b=Integer.parseInt(tokens[i].substring(1,tokens[i].length()));
if(tokens[i].charAt(0)=='A'){
x-=b;
}
if(tokens[i].charAt(0)=='W'){
y+=b;
}
if(tokens[i].charAt(0)=='S'){
y-=b;
}
if(tokens[i].charAt(0)=='D'){
x+=b;
}
}catch(Exception e){
continue;
}
}
System.out.println(x+","+y);
}
}
}
4. 本题总结.
相比之下优秀解法中的解法方式就简便了很多.
因为只有四个反向,所有就只出现四中情况判断即可.
直接全部房子啊异常中,不符合条件可能引起异常的就直接忽略.