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;
}
}
}