(学习笔记)逻辑练习题(一)

想起之前阿里的面试题,简单跟大家分享一下:

两个字符串倒序求和

例如:

字符串a = "123",字符串b = "234";

倒序之后: a="321",b="432";

将结果转int 求和:753 ,结果输出为753。

请列举出所有可能出现的情况。

问题分析:

1.字符串可能为空,为null

2.字符串可能是负数,可能有小数,可能非数字

3.代码规范+优雅

4.难度不大,重点在手撕,本人属于手撕较差的,str.toCharArray()都会写成str.toCharArrays()哈哈!

我的解决方案:

 public static void main(String[] args) {
        String str1 = "0阿萨德76asda6", str2 = "-01.1a2";
        System.out.println(addStr(str1, str2));
    }

    /**
     * 两个字符串倒序求和
     * 例:
     * String str1 = "123";
     * String str2 = "456";
     * <p>
     * return 975
     */

    public static int addStr(String str1, String str2) {
        return checkStrParam(str1) + checkStrParam(str2);
    }

    /**
     * 主方法
     */
    private static Integer checkStrParam(String str) {
        System.out.println("开始执行+++++++++++++源数据:" + str);
        Integer result;
        boolean isNegative;
        String symbol = "-", point = ".";

        //NULL&空字符处理
        str = isBank(str);

        //空格处理
        str = str.trim();

        //负数处理
        isNegative = isNegative(str, symbol);

        //小数处理
        str = havePoint(str, point);

        //过滤&倒序处理
        str = orderDesc(str);

        //负数补充'-'符号
        str = isNegative ? symbol + str : str;
        System.out.println("执行完毕+++++++++++++最终数据:" + str);

        //得出结果
        result = Integer.valueOf(str);
        return result;
    }

    private static String isBank(String str) {
        if (StringUtils.isBlank(str)) {
            str = "0";
            System.out.println("str为空,返回0");
        }
        return str;
    }


    private static boolean isNegative(String str, String symbol) {
        String str2 = StringUtils.EMPTY;
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (String.valueOf(chars[i]).matches("[^0-9]")) {
                str2 += chars[i];
            }
        }
        return str2.contains(symbol);
    }

    private static String havePoint(String str, String point) {
        if (str.contains(point)) {
            int index = str.indexOf(point);
            System.out.println("小数舍去。");
            str = str.substring(0, index);
        }
        System.out.println("负数转换结果:" + str);
        return str;
    }

    private static String orderDesc(String str) {
        String result = StringUtils.EMPTY;
        //去除非数字
        String regEx = "[^0-9]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        str = m.replaceAll("").trim();
        System.out.println("非数字转换结果:"+str);
        //倒序,并且负数加 -
        char[] chars1 = str.toCharArray();
        for (int i = 0; i < chars1.length; i++) {
            String temp = String.valueOf(chars1[i]);
            result = temp + result;
        }
        System.out.println("字符倒排结果:"+result);
        return result;
    }
开始执行+++++++++++++源数据:0阿萨德76asda6
负数转换结果:0阿萨德76asda6
非数字转换结果:0766
字符倒排结果:6670
执行完毕+++++++++++++最终数据:6670

开始执行+++++++++++++源数据:-01.1a2
小数舍去。
负数转换结果:-01
非数字转换结果:01
字符倒排结果:10
执行完毕+++++++++++++最终数据:-10

6660

代码供参考,有不严谨的地方可以讨论一下,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值