牛客网华为机试#HJ17

错误一:

未读明白题目:题中说是

输入:
合法坐标为A(或者D或者W或者S) + 数字(两位以内)

这说明是移动的数字长度在两位之内那就是包括两位数字和一位数字,
也就是想A7是合法的。但是自己错认为是只能是两位数字。

错误二

对能输入数据认识不全面,输入的字符串可以是空的也可以是长度为1、2、3、4及以上,但是只考虑了长度大于3和长度为1的情况。

if (s.length()>3 || s.length()==0) 

应该考虑全面,合法的字符包括长度为2和3的

if (s.length()!=3 || s.length()!=2)

不足

未学习到正则表达式,使得代码写得又臭又长

 if (s.length()!=3 || s.length()!=2)
                continue;
            else if(! hashSet.contains(s.charAt(0)))
                continue;
            else if(s.length()==2 && !(Character.isDigit(s.charAt(1))))
                continue;
            else if ( s.length()==3 && (!Character.isDigit(s.charAt(1))) | (!Character.isDigit(s.charAt(2)))) {
                continue;
            }else
                sList.add(s);

以上代码等价于:

if (!s.matches("[WASD][0-9]{1,2}"))
                continue;
            else
                sList.add(s);

给出垃圾的完整代码:


import java.util.*;

public class Main2 {
    public static void main(String[] args) {
        HashSet<Character> hashSet = new HashSet<>();
        hashSet.add('A');
        hashSet.add('D');
        hashSet.add('W');
        hashSet.add('S');

        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] ss = str.split(";");
        ArrayList<String> sList = new ArrayList<>();

        for(String s : ss){
            //if (s.length()>3 || s.length()==0)  这种就是错误的写法容易发生数组越界错误,因为当输入的是长度为2的字符时,
            //下面的第二个else if就发生了月结错误,因此我们要考虑到所有的输入可能,这个字符长度可能是0,1,2,3,4,更多

            if (s.length()!=3 && s.length()!=2)
                continue;
            else if(! hashSet.contains(s.charAt(0)))
                continue;
            else if(s.length()==2 && !(Character.isDigit(s.charAt(1))))
                continue;
            else if ( s.length()==3 && (!Character.isDigit(s.charAt(1))) | (!Character.isDigit(s.charAt(2)))) {
                continue;
            }else
                sList.add(s);
             /*
            if (!s.matches("[WASD][0-9]{1,2}"))
                continue;
            else
                sList.add(s);

              */
        }

        int x=0;
        int y=0;
        int slide = 0;

        for (String sub : sList)
            System.out.println(sub);

        for (String s:sList){
            slide = Integer.parseInt(s.substring(1));
            switch (s.charAt(0)){
                case 'A': x = x - slide;
                    break;
                case 'S':y = y-slide;
                    break;
                case 'W':y = y  + slide;
                    break;
                case 'D':x =x + slide;

            }
        }

        System.out.println(x + "," + y);


    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值