剑指.高质量的代码(代码的完整性)

250 阅读3分钟

16.数值的整数次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,不需要考虑大数问题

解题思路
考查考虑问题的全面性

  1. 按照幂的定义。循环累乘
  2. 注意,若给定的指数为负数,则返回累乘的倒数
  3. 若给定的指数为零,则返回1
  4. 底数若为零的情况
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;
        }
    }