【算法】解题总结:剑指Offer 47 极限条件下求1+2+3+...+n、剑指Offer 53 表示数值的字符串

JZ47 求1+2+3+…+n

(中等)

题目

描述
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

示例
输入:
5
返回值:
15

思路

此题的条件限制得特别苛刻,但是由于这是一个从 1 加到 n 的有序等差数列的和,因此,我们可以以 1 为边界条件,很容易就可以想到用递归的方式来实现这道题(这道题也就是考验做题者对递归的熟悉程度,因为在这样的限制条件下,递归是唯一的办法)。

大体的思路如下图,但是由于我这段测试也出现了 if 判断语句,而题目条件中也是不允许有 if 的,因此我们需要将 if 用别的语句来替换掉,但又能不失其效用,这才是难点(我当时认为这是难点,因为确实不容易直接想到用逻辑与&&,但如果想到了,那就是两行代码的事就能做出来,这也是我之后看了官方题解才明白了如何解决)。
在这里插入图片描述

根据我们之前的测试方法和题目条件,我们知道之后当 n > 1 时,才可以进入递归,否则如果 n = 1,则直接返回 n 即可,因此,n > 1 和能进入递归这两个条件是同时发生的,我们可以用逻辑与(&&)来实现,并且为了不报语法错误,用一个临时的布尔型变量来承接逻辑与后的结果,并且还要在递归时加上一个可以进行下去而不报语法错误的条件,例如 > 1 即可解决,具体细节如下图所示:

在这里插入图片描述

实现

public class JZ47求123到n的和 {

    //public int Sum_Solution1(int n) {
    //    if (n == 1) return 1;
    //    return n + Sum_Solution1(n - 1);
    //}

    public int Sum_Solution(int n) {
        boolean tmp = (n > 1) && (n = n + Sum_Solution(n - 1)) > 1;
        return n;
    }

    public static void main(String[] args) {
        JZ47求123到n的和 s = new JZ47求123到n的和();
        //System.out.println("s.Sum_Solution1(5) = " + s.Sum_Solution1(5));
        System.out.println("s.Sum_Solution(5) = " + s.Sum_Solution(5));
    }
}

在这里插入图片描述

JZ53 表示数值的字符串

(中等)

题目

描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

示例1
输入:
“123.45e+6”
返回值:
true

示例2
输入:
“1.2.3”
返回值:
false

思路

1 暴力判断

这个题本来想用循环加判断,把各种情况都分析出来这样做,但是,情况越写越多,最终测试数据(已通过百分之九十左右),改好一个,另一个可能就出了问题,这代码算是半个废品了,我也不打算继续写了,再改也是一些小毛病了,具体代码的部分截图如下:
在这里插入图片描述

2 正则表达式

这里顺便推荐一个正则表达式的可视化网站
在这里插入图片描述
(下面代码的来源)

public boolean isNumeric2(String str) {
        // write code here
        // ^表示开头 $ 表示结尾  java中两个\\ 代表一个\
        // * 零次或多次匹配前面的字符或子表达式
        // ?零次或一次匹配前面的字符或子表达式
        // + 一次或多次匹配前面的字符或子表达式
        // [] 字符集。匹配包含的任一字符
        // (:? )匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配
        String p = "^[+-]?\\d*(?:\\.\\d*)?(?:[eE][+-]?\\d+)?$";
        return Pattern.matches(p, str);
}

下图可见,提交时还是报错,因此用正则表达式解决这道题时,由于正则表达式不能独立做一些特殊情况的判断,况且是有关联关系的判断,因此还需要预先罗列出特殊情况的判断方法,之后再交给正则表达式判断一般性的情况,思路就是这样,但也是比较麻烦,需要考虑很多特殊情况。
在这里插入图片描述

3 内置函数 + 异常

其实一开始也是想直接用 Java 自带的函数的,但是那样却得不到锻炼,不过现在已经这样了,那就用一下吧。。

这样,直接用 parseDouble 方法加个异常检验就可以了,无比简单,但是却得不到什么锻炼。

public class JZ53表示数值的字符串 {

    public boolean isNumeric (String str) {
        try {
            Double.parseDouble(str);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超周到的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值