16.数值的整数次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,不需要考虑大数问题
解题思路:
考查考虑问题的全面性
- 按照幂的定义。循环累乘
- 注意,若给定的指数为负数,则返回累乘的倒数
- 若给定的指数为零,则返回1
- 底数若为零的情况
public class Solution {
public double Power(double base, int exponent) {
double res = 1.0;
if(exponent == 0){
res = 1;
}
if(exponent > 0){
for(int i = 0; i < exponent; i++){
res = res * base;
}
}
if(exponent < 0){
exponent = - exponent;
for(int i = 0; i < exponent; i++){
res = res * base;
}
res = 1 / res;
}
return res;
}
}
17.打印从1到最大的n位数
18.删除链表的节点
19.正则表达式匹配
题目描述:请实现一个函数用来匹配包括"."和"*"的正则表达式。模式中的字符"."表示任意一个字符,而"*"表示它前面的字符可以出现任意次(包含0次)
在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
解题思路:
20.表示数值的字符串
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是
解题思路:首先,搞清楚组成数字的4个部分:
数字本身 0-9
数字符号 + 或 -
小数点 .
e或E
然后,判断每一个数字位,判断时需要考虑3种情况:
1.若是正负号,必须出现在首位或e的后一位
2.若是e,之前必须出现过数字且没出现过e
3.若是.,之前必须没出现过.和e
最后,需要设置4个标识位:
boolean pointSeen = false; //是否出现过小数点“.”
boolean eSeen =false; //是否出现过指数标志“e”
boolean numberSeen = false; //是否出现过数字
boolean numberAfterE = true; //e后面是否有数字
public class Solution {
public static boolean isNumeric2(char[] s) {
if (s == null || s.length == 0)
return false;
// 记录是否出现过数字
boolean numberSeen = false;
// 是否出现过小数点
boolean pointSeen = false;
// 是否出现过指数标志e
boolean eSeen = false;
// e后是否出现过数字
boolean numberAfterE = false;
for (int i = 0; i < s.length; i++) {
char c = s[i];
// 如果是数字
if (c >= '0' && c <= '9') {
numberSeen = true;
numberAfterE = true;//对于输入为纯数字的情况,要先设为true
// 如果是小数点
} else if (c == '.') {
if (pointSeen || eSeen)
return false;
pointSeen = true;
// 如果是e || E,必须出现过数字且没出现过e
} else if (c == 'e' || c == 'E') {
if (eSeen || !numberSeen)
return false;
eSeen = true;
numberAfterE = false;
// 如果出现正负号,必须是首位,或者前一位是e || E
} else if (c == '+' || c == '-') {
if (i != 0 && s[i - 1] != 'e' && s[i - 1] != 'E')
return false;
} else
return false;
}
return numberSeen && numberAfterE;
}
}