算法打卡第二十五天

122 阅读3分钟
  1. 剑指 Offer 20. 表示数值的字符串
  2. 剑指 Offer 67. 把字符串转换成整数

剑指 Offer 20. 表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)

数值(按顺序)可以分成以下几个部分:

若干空格 一个 小数 或者 整数 (可选)一个 'e' 或 'E' ,后面跟着一个 整数 若干空格 小数(按顺序)可以分成以下几个部分: (可选)一个符号字符('+' 或 '-') 下述格式之一: 至少一位数字,后面跟着一个点 '.' 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字 一个点 '.' ,后面跟着至少一位数字 整数(按顺序)可以分成以下几个部分: (可选)一个符号字符('+' 或 '-') 至少一位数字 部分数值列举如下: ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下: ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

提示:

1 <= s.length <= 20 s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。

题意理解: 判断一个字符串是否能表示为一个数字


var isNumber = function (s) {
    // 开头 空格 数字 + - . 
    // 结尾 空格 数字
    // e E . 只能出现一次 

    // 0 开始的字符
    // 1 数字正负号
    // 2 小数点钱的数字
    // 3 小数点后的数字
    // 4 无小数点时的数字
    // 5 e后的内容
    // 6 e后的正负号后的数字
    // 7 结尾数字
    // 8 结尾的空格

    //  -12.12e-12.35
    let p = 0;
    const arr = [
        { " ": 0, "s": 1, "n": 2, ".": 4 },// 开始字符
        { "n": 2, ".": 4 }, // 正负号后的字符
        { "n": 2, ".": 3, "e": 5, " ": 8 }, // 数字后的字符
        { "n": 3, "e": 5, " ": 8 }, // 
        { "n": 3 }, // e前的数字
        { "s": 6, "n": 7 }, // e后的内容
        { "n": 7, }, // e后的正负号后的数字
        { "n": 7, " ": 8 }, // 结尾数字
        { " ": 8 }, // 结尾空格
    ]
    let t;
    const ss = s.split("")
    for (const str of ss) {
        if (str === "+" || str === "-") {
            t = "s"
        } else if (str <= "9" && str >= "0") {
            t = "n";
        } else if (str === "e" || str === "E") {
            t = "e"
        } else if (str === "." || str === " ") {
            t = str
        } else {
            t = false
        }
        console.log(str);
        if (!arr[p][t]) return false;
        p = arr[p][t]
    }
    return p === 2 || p === 3 || p === 7 || p === 8
};

剑指 Offer 67. 把字符串转换成整数

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。 该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。 在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明: 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231)

题意理解: 输出字符串收个符合的数字组合 边界一定要考虑周全,本人提交后报错,才发现自己没考虑全

  1. 声明两个变量,一个num用来存储数字,一个s用来存储符号
  2. 遍历字符串,先把字符串前面的空格忽略, 当出现符号或数字后空格就为终止条件
  3. 如果去除空格后是符号,则将符号赋值,且数字为null
  4. 遍历字符串,如果是数字则将数字累乘10 + 当前数字;否则结束循环
  5. 如果符号为-,且数字大于2147483648及2的32此,则赋值-2147483648;否则为整数,数字大于等于2147483648则num=2147483647及2的32次-1;最后返回num
var strToInt = function(str) {
    let num = null;
    let s = "";
    for (let i = 0; i < str.length; i++) {
        if (!s && num===null && str[i] === " ") {
            continue;
        }
        if (num===null && (str[i] === "-" || str[i] === "+") && !s) {
            s = str[i]
            continue;
        }
        if (str[i] <= "9" && str[i] >= "0") {
            num = num * 10 + str[i] * 1
        } else {
            break
        }
    }
    if (s === "-") {
        num = num > 2147483648 ? -2147483648 : -num
    } else if (num >= 2147483648) {
        num = 2147483647
    }
    return num * 1 
};