剑指 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)
题意理解: 输出字符串收个符合的数字组合 边界一定要考虑周全,本人提交后报错,才发现自己没考虑全
- 声明两个变量,一个num用来存储数字,一个s用来存储符号
- 遍历字符串,先把字符串前面的空格忽略, 当出现符号或数字后空格就为终止条件
- 如果去除空格后是符号,则将符号赋值,且数字为null
- 遍历字符串,如果是数字则将数字累乘10 + 当前数字;否则结束循环
- 如果符号为-,且数字大于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
};