华为在线编程题系列-17- 坐标移动

问题描述:
问题描述
问题描述

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. 本题总结.

相比之下优秀解法中的解法方式就简便了很多.
因为只有四个反向,所有就只出现四中情况判断即可.
直接全部房子啊异常中,不符合条件可能引起异常的就直接忽略.

猜你喜欢

转载自blog.csdn.net/u012222078/article/details/80216430